# Контроллеры в своем MVC фреймворке в PHP

Как вы уже знаете, все контроллеры нашего фреймворка имеют метод `render`, который нужно вызывать для отправки данных в представление. Этот метод наши, пользовательские контроллеры наследуют от родительского класса `Controller`, расположенного в ядре. Давайте сделаем этот класс:

`<?php namespace Core; class Controller { protected function render($view, $data) { } } ?>`

Как вы видите, метод `render` параметром принимает имя представления и данные для отображения. Пусть этот метод возвращает объект специального класса `Page`, в котором будет содержаться информация о представлении данных действия контроллера. В этом классе будет содержаться имя представления, данные, а также тайтл страницы и имя файла с макетом сайта:

`<?php namespace Core; class Page { private $layout; private $title; private $view; private $data; public function __construct($layout, $title, $view, $data) { $this->layout = $layout; $this->title = $title; $this->view = $view; $this->data = $data; } public function __get($property) { return $this->$property; } } ?>`

Тогда код нашего метода `render` будет выглядеть вот так:

`<?php namespace Core; class Controller { protected $layout = 'default'; protected function render($view, $data) { return new Page($this->layout, $this->title, $view, $data); } } ?>`

Поясню, что здесь происходит. Имя представления и данные приходят параметрами метода. Однако, в пользовательском контроллере задается еще и тайтл страницы - путем записывания свойства `title`. Значит, в `$this->title` и будет содержаться тайтл, который мы передадим конструктору класса `Page`.

Есть также нюансы с лэйаутом. Как вы знаете, наш фреймворк использует лэйаут из файла `default.php`. На самом деле, каждое действие может иметь и другой лэйаут. Для этого нужно в самом действии в свойство `layout` записать другое имя лэйаута.

Как это достигается: наш родительский контроллер имеет свойство `layout`, по умолчанию имеющее значение `'default.php'`. Это и будет лэйаутом по умолчанию. Однако, если действие пользовательского контроллера переопределит значение свойства `layout`, то и лэйаут будет другим.

Скопируйте код моего класса `Controller` и разместите его в файле `/core/Controller.php`.

Скопируйте код моего класса `Page` и разместите его в файле `/core/Page.php`.

← →
↑