Я просто направляюсь к шаблону проектирования MVC. Простой пример здесь не позволяет понять мою концепцию использования контроллера. Не могли бы вы объяснить реальное использование контроллера, сохраняя его простым.
Модель:
class Model { public $text; public function __construct() { $this->text = 'Hello world!'; } }
контроллер:
class Controller { private $model; public function __construct(Model $model) { $this->model = $model; } }
Посмотреть:
class View { private $model; //private $controller; public function __construct(/*Controller $controller,*/ Model $model) { //$this->controller = $controller; $this->model = $model; } public function output() { return '<h1>' . $this->model->text .'</h1>'; } }
индекс:
require_once('Model.php'); require_once('Controller.php'); require_once('View.php'); //initiate the triad $model = new Model(); //It is important that the controller and the view share the model //$controller = new Controller($model); $view = new View(/*$controller,*/ $model); echo $view->output();
Назначение контроллеров в шаблоне MVC заключается в изменении состояния слоя модели.
Это делается контроллером, принимающим пользовательский ввод (предпочтительнее – абстрагируется как нечто вроде экземпляра Request
), а затем, основываясь на параметрах, извлеченных из пользовательского ввода, передает значения соответствующим частям слоя модели.
Связь с модельным уровнем обычно происходит через различные службы . Эти службы, в свою очередь, отвечают за управление взаимодействием между абстракцией персистентности и предметами домена / бизнеса или также называемой «логикой приложения».
class Account extends \Components\Controller { private $recognition; public function __construct(\Model\Services\Recognition $recognition) { $this->recognition = $recognition; } public function postLogin($request) { $this->recognition->authenticate( $request->getParameter('credentials'), $request->getParameter('method') ); } // other methods }
Контроллеры в архитектурном шаблоне MVC НЕ отвечают за:
Контроллер в PHP (или, фактически, на любом языке сервера, будет тот, который обрабатывает URL-адрес, который вызывается). Поэтому мне придется переписать ваш код выше,
Основной файл; это на самом деле будет вашим основным контроллером или маршрутизатором, это первый файл, который вызывается и обычно будет называться index.php (в этом файле просто создается экземпляр контроллера, нет необходимости создавать модель и представление, поскольку они будут в в отношении модели и вида использования)
require_once('Controller.php'); //check the user url and decide which controller to instantiate. This is usually done by a separate file called controller factory. But for simplicity we use take this decision here itself. $controller = new Controller() //call controllers default method and let it decide which internal function to call $controller->index()
Файл контроллера => Здесь создается экземпляр модели и просмотра. Преимуществом является то, что модель и представление могут быть изменены, если это необходимо в самом контроллере
require_once "Model.php" require_once "View.php" class Controller { private $model; private $view; public function _contruct() { // i may and may not initialize my mocel or view here, better initialize it in the function where you are going to use them. } public function index() { // for now assume this controller just does one function that is to display the hello world. Otherwise we will read the called url and decide which further function to call $model = new Model(); $view = new View($model); // pass the model to view $view->output() // don't ideally echo here, let view itself echo the content. This is helpfull cases where you may have a view which echos the content or may want to format it in certain way (eg JSON and return it to the caller }
Это в значительной степени. Я не вижу никаких изменений кода в вашей модели или файлах просмотра. Theu shoudl работает так, как если бы вы не повторили его, а не возвращали его.