<< Контроллер | Инъектор зависимостей >>
В предыдущей части мы настроили контроллер и вывели информацию в окно браузера с помощью команды echo
. Но давайте не забывать о том что у нас имеется хорошая, объектно-ориентировання абстракция для работы с HTTP. К сожалению, сейчас, у нас нет доступа к классам ответа и запроса из нашего контроллера.
Хорошей практикой является использование инверсии управления. Это означает, что вместо того, чтобы возлагать обязанности по созданию объектов на класс, мы просто запрашиваем нужные нам объекты из контейнера. Данный подход реализуется с помощью внедрения зависимостей. Не беспокойтесь, если сейчас это звучит как-то сложно. Просто следуйте руководству и вы убедитесь в том, что данный подход действительно прост в реализации.
Давайте немного изменим наш Homepage
контроллер:
<?php declare(strict_types = 1);
namespace Example\Controllers;
use Http\Response;
class Homepage
{
private $response;
public function __construct(Response $response)
{
$this->response = $response;
}
public function show()
{
$this->response->setContent('Hello World');
}
}
Обратите внимание, что мы импортируем Http\Response
в верхней части файла. Это означает, что всякий раз, когда вы используете имя Response
внутри данного файла, PHP подставляет полное имя этого класса.
Мы явно указываем тип передаваемого в конструктор аргумента как Http\Response
. В данном случае Http\Response
является интерфейсом, а значит любой класс который реализовывает данный интерфейс может быть внедрен в наш контроллер. Более подробно об объявлении типов и интерфейсах.
Поскольку мы еще ничего не внедрили, наш код будет генерировать ошибку. Давайте это исправим. В файле Bootstrap.php
при создании экземпляра контроллера, передадим объект ответа в аргумент конструктора:
$class = new $className($response);
$class->$method($vars);
Класс Http\HttpResponse
имплементируетHttp\Response
интерфейс, а значит мы можем использовать его в данном контроллере. Сейчас код должен работать как прежде. Но если оставить все как есть, то абсолютно все контроллеры будут принимать одни и теже объекты. Давайте исправим эту проблему в следующем разделе.