Skip to content

Latest commit

 

History

History
46 lines (31 loc) · 4.26 KB

07-inversion-of-control.md

File metadata and controls

46 lines (31 loc) · 4.26 KB

<< Контроллер | Инъектор зависимостей >>

Инверсия управления

В предыдущей части мы настроили контроллер и вывели информацию в окно браузера с помощью команды 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 интерфейс, а значит мы можем использовать его в данном контроллере. Сейчас код должен работать как прежде. Но если оставить все как есть, то абсолютно все контроллеры будут принимать одни и теже объекты. Давайте исправим эту проблему в следующем разделе.

<< Контроллер | Инъектор зависимостей >>