Controller в MVC

03.06.2018 в 18:39
20701
+1195

Итак, мы разобрались за что должен отвечать каждый слой модели 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.

loader
03.06.2018 в 18:39
20701
+1195
Логические задачи с собеседований