Создание MVC для работы (PHP) - структура класса quandry - PullRequest
0 голосов
/ 22 марта 2012

PHP - вопрос MVC: Итак, это вопрос довольно высокого уровня о создании MVC.У меня есть класс с именем page, и он должен использовать классы для модели, представления и контроллера.Существует также класс Route, который имеет в основном атрибуты, относящиеся к Path: / Class / Method / arg1 / arg2 и т. Д.

Прямо сейчас страница извлекает объект Route в качестве параметра конструктора.

Должны ли модель, вид и контроллер расширять страницу?В то время как M, V и C нуждаются в определенной информации из объекта Route, я не думаю, что логически Модель, например, расширяет страницу - потому что, хотя она является частью страницы, это не другой тип страницы, и яне уверен, что M, V и C должны быть настолько близки друг к другу.

Но я все равно решил спросить.Я обнаружил, что делаю, что страница передает этот объект Route контроллеру, когда он создает его, затем то же самое с моделью, представлением и т. Д.

Я знаю, каждый раз, когда вы обнаруживаете, что делаете избыточные вещитаким образом, может быть, пора отступить и переосмыслить, прежде чем делать слишком много работы на этом пути.

Но опять же, на мой взгляд, M, V и C не являются формами страницы, это скорее композиция.

Мысли?

Спасибо!

Ответы [ 3 ]

1 голос
/ 22 марта 2012

Ваши модели и представления, вероятно, не должны расширять страницу.

Когда дело доходит до работы MVC, вы должны разделить три проблемы на их логическую основу.

Ваша маршрутизация, на мой взгляд, является еще одной отдельной сущностью, которая направляет ваш загрузчик на действие, содержащееся в контроллере.

Контроллеры обрабатывают вводимые пользователем данные, и если он представляет собой тип элемента управления, такого как Page, тогда имеет смысл расширить базовый PageController для всех общих функций, которые должны выполняться при создании страницы.

Контроллеры воспринимают взаимодействие с пользователем и взаимодействуют с моделями. Вряд ли эти двое должны иметь общую родословную. Модели действуют как интерфейс для бизнес-логики и данных, управляя взаимодействием с постоянными хранилищами и преобразовывая данные.

Данные / преобразования, созданные в моделях и созданные в контроллерах, передаются в представление.

Представления управляют логикой представления о том, как данные должны быть представлены пользователю. В идеальном мире преобразование данных не должно происходить на уровне.

Так что в моем MVC у меня были бы базовые классы Model, View и Controller, которые наследуются дочерними классами.

0 голосов
/ 22 марта 2012

Если я правильно вас понимаю, ваш класс Page на самом деле является гибридом между автозагрузчиком, фабрикой mvc и контейнером для всего приложения. Это три разные обязанности, одна из которых совершенно бессмысленна. PHP это не Java. .. мы не используем класс "сдерживания".

Кроме того, вы должны спросить, почему ваши Model и View нуждаются в доступе к Route. Хорошо, я мог бы увидеть причину этого в View, если вы также используете его для генерации новых URL, но в модели нет ничего общего с Route.

Ответственность Контроллера заключается в том, чтобы принять запрос и на основании этого выполнить правильную команду (действие). Затем он изменяет состояние слоя Model и связывает Domain Objects с указанного слоя с экземпляром View или другой формой ответа. Затем контроллер возвращает этот экземпляр View.

Что касается других частей, то Controller будет инициировать структуры из слоя Model, но в контроллере должны быть операторы new. Это создало бы тесную связь с названием структур. Вместо этого вы должны оснастить экземпляр контроллера фабрикой моделей. Эта фабрика становится ответственной за инициализацию структур из слоя модели. Это также позволит вам инициализировать одно соединение с БД вне контроллера (и, возможно, некоторый объект Cache), а затем предоставить его фабрике. Теперь вы можете убедиться, что у каждого элемента слоя модели, который имеет дело с доступом к данным, уже установлено соединение с БД. И вы можете использовать одно и то же соединение между всеми объектами доступа к данным.

Что касается того, как передать маршрут к экземпляру Controller:

class Controller
{
    protected $route = null;

    public function setRoute( $route )
    {
        $this->route = $route;
    }
}

потому что вы, скорее всего, будете использовать его так:

class FooBarController extends Controller{}

И где-то в bootstrap.php :

$controller = new $controllerName;
$controller->setRoute( $route );

Вы должны помнить, что конструкторы в PHP не наследуются .

P.S. Вы можете найти этот комментарий , связанный с вашим исследованием.

0 голосов
/ 22 марта 2012

M, V и C требуется определенная информация от объекта Route

Затем вводит требуемые данные в эти объекты.*http://www.slideshare.net/fabpot/dependency-injection-with-php-and-php-53

Кроме того, если Page является фронт-контроллером, возможно, он вообще не должен создавать экземпляры моделей и представлений.Если контроллер должен быть расширен, он мог бы обрабатывать создание экземпляра с помощью метода render и передавать туда информацию о маршрутизации.

Модели должны полностью не знать о маршрутизации и просто предоставлять бизнес-функциональность.Их не должно волновать, поступает ли запрос с веб-сайта или из настольного приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...