Какова цель контроллера в шаблоне MVC с использованием PHP?

Я просто направляюсь к шаблону проектирования 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 работает так же, как и вы, иначе вы будете эхом отображаемого содержимого, а не возвращать его.