Controller в MVC
Итак, мы разобрались за что должен отвечать каждый слой модели MVC. Давайте теперь остановимся более подробно на контроллере.
Контроллер – это точка входа в наше приложение + логика того, что вообще нужно сделать. Контроллер работает с моделями и передаёт результат во View.
Звучит несложно. Так давайте же теперь создадим наш первый контроллер!
Внутри папки src/MyProject создаём папку Controllers. А внутри неё – файл с именем MainController.php. Это будет контроллер для главной страницы сайта. Отсюда и название – Main.
Содержимое этого файла делаем таким:
src/MyProject/Controllers/MainController.php
<?php
namespace MyProject\Controllers;
class MainController
{
public function main()
{
echo 'Главная страница';
}
}
Теперь давайте вернёмся в файл index.php и в нём создадим объект этого класса и вызовем метод main().
www/index.php
<?php
spl_autoload_register(function (string $className) {
require_once __DIR__ . '/../src/' . $className . '.php';
});
$controller = new \MyProject\Controllers\MainController();
$controller->main();
Если вы на Linux/MacOS, то нужно использовать следующий код:
require_once __DIR__ . '/../src/' . str_replace('\\', '/', $className) . '.php';
Это нужно чтобы слэши были в правильном направлении, для unix-систем это важно. Впрочем, и на Windows вы можете использовать этот же код, на нем он тоже будет работать.
Давайте теперь откроем в браузере наш проект и увидим следующее.
Главная страница
Вуаля! Наш первый контроллер готов.
Разумеется, контроллер может быть не один, их может быть несколько. И у контроллера может быть несколько методов.
Давайте добавим метод sayHello() в тот же контроллер. Пусть у этого метода будет один строковый аргумент $name. И всё, что будет делать этот метод – это выводить строку «Привет, $name».
src/MyProject/Controllers/MainController.php
<?php
namespace MyProject\Controllers;
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayHello(string $name)
{
echo 'Привет, ' . $name;
}
}
Теперь давайте добавим в index.php обработку query-параметра name. Если он не пустой, то мы будем вызывать метод sayHello() и передавать туда этот параметр. Иначе – мы будем вызывать метод main().
www/index.php
<?php
spl_autoload_register(function (string $className) {
require_once __DIR__ . '/../src/' . $className . '.php';
});
$controller = new \MyProject\Controllers\MainController();
if (!empty($_GET['name'])) {
$controller->sayHello($_GET['name']);
} else {
$controller->main();
}
Теперь, если мы перейдём по адресу http://myproject.loc то увидим всё ту же «Главную страницу». Но если мы перейдём по адресу http://myproject.loc/?name=Иван то увидим сообщение «Привет, Иван».
Итак, мы разобрались с тем, что такое контроллер и с тем, что у него может быть несколько методов.
Публичные методы контроллера ещё называются action-ами (от англ. action - действие).
Чем же тогда является index.php? Это ведь и точка входа, и место, где мы создаём сам контроллер и вызываем его методы. Этот кусок кода называется фронт-контроллером. И в следующих уроках мы изучим, как можно его усовершенствовать, чтобы не писать кучу кода для создания других контроллеров и сделаем его более гибким.
Код с результатом этого урока на github.
Комментарии