Внедрение зависимостей в CodeIgniter 4

В CodeIgniter 4 будет применяться внедрение зависимостей. Разработчик Лонни Эцелл поделился информацией о том, зачем же нужно внедрять зависимости и как это будет выглядеть в четвертой версии фреймворка CodeIgniter.

Внедрение зависимости (англ. Dependency injection, DI) — это процесс предоставления внешней зависимости программному компоненту.

Внедрение зависимостей разъединяет код от других, специфических, классов. При правильном использовании, внедрение зависимостей позволяет легко заменить зависимость ложным классом во время тестирования, или заменить зависимость совершенно другим классом, который выполняет поставленную задачу лучше.

Если говорить коротко, то внедрение зависимостей делает код более устойчивым к изменениям и более переносимым.

Предположим, что у вас имеется модель для управления учетными данными пользователей. Естественно необходим класс базы данных для работы с данным. Без внедрения зависимостей можно было сделать, например, вот так:

class UserModel
{
    protected $db;

    public function __construct()
    {
        $this->db = new Database();
    }
}


Но здесь появляется проблема. Если вам когда-нибудь нужно будет использовать другую библиотеку базы данных или переключиться с MySQL на MongoDB, то придется изменить код в каждом классе. Если вы запускаете тесты, вы никогда не сможете отделить логику в вашей модели из класса Database. Это не очень удобно. Поэтому, чтобы исправить это, следующим шагом является передача класса базы данных в конструктор, в качестве зависимости.

class UserModel
{
    protected $db;

    public function __construct(DatabaseInterface $db)
    {
        $this->db = $db;
    }
}


Это самая чистая форма внедрения зависимостей. Любые внешние классы, вводятся или через конструктор, либо или через метод установки.
В основе CodeIgniter 4, конструктор на основе DI используется повсеместно. Теперь нет больше необходимости использовать MY_ файлы для расширения или замены функционала. Поэтому можно создать новый класс, который соответствует интерфейсу.

Использование внедрения зависимостей в приложениях не требуется, хотя это рекомендуется. Сама структура использует эти файлы, и они обеспечивают простой способ изменить ядро фреймворка.

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

class Users extends \CodeIgniter\Controller
{
    public function index()
    {
        $model = new UserModel( Config\Services::database() );

        $data = [
            'users' => $model->findAll()
        ];

        echo view('users/list_all', $data);
    }
}


Весь показанный материал приведен в качестве примера, и не отражает полностью окончательный функционал фреймворка каким-либо образом!




Ссылки по теме


Блог Лонни Эцелла: Dependency Injection in CodeIgniter 4
Wikipedia: Внедрение зависимости
CodeIgniter Wikipedia: ru.wikipedia.org/wiki/CodeIgniter
Официальный сайт CodeIgniter: www.codeigniter.com
Официальный форум CodeIgniter: forum.codeigniter.com
CodeIgniter 4: https://habrahabr.ru/post/275657/
CI Community Apps: https://habrahabr.ru/post/276375/
Requests и Responses в CodeIgniter 4: https://habrahabr.ru/post/278489/

Комментарии (4)


  1. dim_s
    09.03.2016 22:38

    Зависимость внедряется по интерфейсу, т.е. ищется имплементирующий класс интерфейса, или же все таки по названию переменной параметра $db?


    1. condor-bird
      09.03.2016 23:32

      По интерфейсу тоже можно. Потом, конечно, что-то изменится, добавится как это всегда бывает. Пока все это смутно.
      Кстати, в заметку я вывел не все фрагменты кода, в статье у Лонни там чуток больше написано.


  1. AlexLeonov
    09.03.2016 22:59
    -4

    Похороните уже покойника. DI они в 2016 году собираются...


    1. condor-bird
      09.03.2016 23:36
      +2

      Не понимаю, к чему подобного рода реплики? Вас же никто не принуждает им пользоваться.