Я просто направляюсь к шаблону проектирования 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();
Ответ 1
Назначение контроллеров в шаблоне 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 НЕ ответственны за:
- инициализация частей слоя модели
- извлечение данных из уровня модели
- проверка ввода
- инициализация просмотров
- выбор шаблонов
- создание ответа
- контроль доступа
- .. и т.д.
Ответ 2
Контроллер в 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 (e.g JSON and return it to the caller
}
Это в значительной степени. Я не вижу никаких изменений кода в вашей модели или файлах просмотра. Theu shoudl работает так же, как и вы, иначе вы будете эхом отображаемого содержимого, а не возвращать его.