Инверсия на контрола (IoC контейнер)

Контейнерният клас Inversion of Control (IoC) на Laravel е мощен инструмент за управление на зависимостите на класа. Инжектирането на зависимости е начин за елиминиране на твърдо кодирани връзки между класове. Вместо това зависимостите се определят по време на изпълнение, което дава повече гъвкавост, тъй като могат лесно да се променят.

Разбирането на контейнера Laravel IoC е необходимо за изграждане на големи приложения, както и за извършване на промени в основния код на самата рамка.

Използване

Поставяне в контейнер

Има два начина, по които IoC контейнер разрешава зависимости: чрез функция за затваряне и чрез автоматично откриване.

Първо, нека да разгледаме затварянията. Нека поставим нещо в контейнер и да го наречем foo:

Екстракт от контейнера

Когато се извика методът App::make, се извиква съответната функция за затваряне и се връща резултатът от нейното извикване.

Поставяне на споделен тип в контейнер

Понякога може да искате да поставите нещо в контейнер, който трябва да бъде създаден само веднъж и всички следващи извиквания трябва да върнат същия обект.

Поставяне на готов екземпляр в контейнер

Можете също така да поставите вече създаден обект в контейнер, като използвате метода на екземпляра:

Къде да напиша код?

Автоматично откриване на клас

Автоматично откриване на клас

IoC контейнерът е достатъчно мощен, за да дефинира автоматично класове в много случаи, без допълнителна конфигурация.

Обърнете внимание, че дори без изрично поставяне на класа FooBar в контейнера, той все още беше дефиниран и зависимостта Baz беше автоматично инжектирана в него.

Ако типът не е намерен в контейнера, IoC ще използва възможностите на PHP, за да инспектира класа ипроверка на типа в неговия конструктор. С тази информация самият контейнер създава екземпляр на класа.

Интерфейс и обвързване на изпълнението

В някои случаи клас може да вземе екземпляр на интерфейс, а не самия обект. В този случай трябва да използвате метода App::bind, за да уведомите контейнера коя зависимост трябва да бъде инжектирана.

Сега нека да разгледаме следния контролер:

Тъй като сме обвързали UserRepositoryInterface с „реалния“ клас, DbUserRepository, той ще бъде автоматично вграден в контролера, когато бъде създаден.

Практическа употреба

Laravel предоставя няколко опции за използване на IoC контейнера, за да увеличите гъвкавостта и възможността за тестване на вашето приложение. Основен пример е инжектирането на зависимост при използване на контролери. Всички контролери са извлечени от IoC, което ви позволява да използвате зависимости, базирани на тип, в техните конструктори, тъй като те ще бъдат автоматично открити.

Проверка на типа за указване на зависимостите на контролера

В този пример класът OrderRepository ще бъде автоматично вграден в контролера. Това означава, че когато се използват модулни тестове, към контейнера може да бъде добавен клас мъниче ("mock") за OrderRepository, като по този начин лесно се симулира взаимодействие с базата данни.

Други случаи на използване на IoC

Филтри, композатори на изгледи и манипулатори на събития също могат да бъдат извлечени от IoC. Когато регистрирате тези обекти, просто предайте името на класа, който ще се използва:

Доставчици на услуги

Повечето компоненти на Laravel включват свои собствени доставчици на услуги. Всички регистрирани доставчици на услуги във вашето приложение са изброени в масива доставчици на конфигурационния файл app/config/app.php.

Създаване на доставчик на услуги

За да създадете нов доставчик на услуги, просто разширете класа Illuminate\Support\ServiceProvider и дефинирайте метода за регистриране.

Имайте предвид, че вътре в метода register IoC контейнерът на приложението е наличен в свойството $this->app. След като създадете доставчик и сте готови да го регистрирате с вашето приложение, просто го добавете към масива с доставчици в конфигурационния файл app/config/app.php.

Регистриране на доставчици на услуги по време на изпълнение

Можете да регистрирате доставчици на услуги в движение, като използвате метода App::register:

Контейнерни събития

Регистриране на манипулатор на събития

IoC контейнерът задейства събитие всеки път, когато се извлича обект. Можете да го следите с метода за разрешаване:

Създаденият обект се предава на функцията за затваряне като параметър.