Контроллеры, действия и роуты в MVC на PHP

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

Контроллеры представляют собой ООП классы. Один файл - это один класс и, соответственно, один контроллер. В нашем фреймворке контроллеры будут храниться в папке project/controllers.

Давайте потренируемся в создании контроллеров. Для разминки сделаем класс PageController, который будет управлять текстовыми страницами на нашем сайте.

Давайте сразу создадим файл для нашего контроллера. По правилам нашего фреймворка каждый класс должен хранится в файле с одноименным названием (вплоть до регистра). То есть наш класс PageController будет хранится в файле PageController.php. Создайте этот файл в папке project/controllers.

Сделаем в этом файле наш класс:

<?php namespace Project\Controllers; use \Core\Controller; class PageController extends Controller { } ?>

Как вы видите, наш класс принадлежит пространству имен Project\Controllers, следуя соглашению об автозагрузке файлов (то есть путь по папкам должен совпадать с пространством имен).

Кроме того, наш класс наследуется от класса Core\Controller, находящегося в ядре фреймворка. В этом не нужно искать глубокий смысл, а просто нужно принять как правило фреймворка. Вот это правило: все создаваемые вами контроллеры должны наследоваться от класса Core\Controller, чтобы все работало, как надо.

Действия

Добавим теперь в наш контроллер методы класса. В терминах MVC методы контроллеров называются действиями (англ. actions). Сделаем, например, два действия - show1 и show2, и в каждом действии выведем что-нибудь на экран:

<?php namespace Project\Controllers; use \Core\Controller; class PageController extends Controller { public function show1() { echo '1'; } public function show2() { echo '2'; } } ?>

Роутинг

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

Настройки роутинга хранятся в файле /project/config/routes.php и представляют собой массив объектов класса \Core\Route. Конструктор этого класса первым параметром принимает URI, по запросу которого вызовется соответствующий метод соответствующего контроллера. Имя контроллера и имя действия задаются вторым и третьим параметрами. При этом имя контроллера задается с маленькой буквы.

Давайте для примера добавим два роута (то есть маршрута): первый при обращении к адресу /my-page1/ будет вызывать метод show1 контроллера page, а второй - метод show2 этого же контроллера:

<?php use \Core\Route; return [ new Route('/my-page1/', 'page', 'show1'), new Route('/my-page2/', 'page', 'show2'), ]; ?>

Практические задачи

Сделайте контроллер TestController с действиями act1, act2 и act3. Сделайте три роута, задающие адреса, по которым можно будет обратиться к этим действиям. Проверьте работу созданного вами кода, по очереди обратившись через адресную строку к каждому из действий.