Автор оригинала: David Wong.
Статья была отправлена профессиональному сообществу разработчиков Laravel с оригинальной ссылкой: https://learnku.com/ларавель/т…
Изучение того, как создавать приложения с помощью Laravel, – это не просто обучение использованию компонентов в разных классах и фреймворках, это не значит запоминать все. ремесленник Команда или все вспомогательные функции (у нас есть Google). Изучение кода Laravel-это изучение его философии и грамматики. Лично я думаю, что это искусство и ремесло (по совпадению, инженеров Laravel иногда называют веб-художниками). Это справедливо и для других фреймворков.
Сервисные контейнеры и контейнеры IOC являются основными частями философии Laravel. Как разработчик laravel, для вас важно правильно понимать и использовать контейнер службы, потому что он является ядром любого приложения laravel.
Основы
Хотя контейнеры IOC по сути являются обычным классом PHP, мне нравится думать о них как о “карманных навыках”. Этот “пакет” означает, что мы размещаем или “привязываем” любые службы объектов, которые нам необходимо запускать в приложениях Laravel, от реализации интерфейса до путей к каталогам и так далее. Так что это называется “навык в мешке”.
Теперь у нас есть один объект (контейнер IOC), содержащий все связанные службы объектов, поэтому в нашем коде легко получить или “проанализировать” эти службы объектов из этого одного объекта в любое время.
Как обрабатываются привязки
Теперь предположим, что у нас есть класс FooService со специальной функцией.
Если мы хотим вызвать метод doSomething класса, мы могли бы сделать это:
$fooService = new \App\Services\FooService();\ $fooService->doSomething();
Это, кажется, не проблема, но проблема в ключевом слове “новый” здесь. Я имею в виду, что, хотя это и хорошо, мы можем сделать это более элегантно (не забывайте писать код изящным способом, как Laravel).
Как связать?
Привязка достаточно проста, чтобы ее можно было выполнить в одной строке кода
$this->app->bind('FooService', \App\Services\FooService::class);В Laravel мы часто говорим: “Умело внедряйте услуги общественного питания в пакеты”.
Конечно, существуют и другие способы привязки сервисов в соответствии со сценарием использования и режимом обслуживания, если вы понимаете его основную идею. Для получения полной информации о привязках см. Контейнер службы документации Laravel
Важно отметить, что услуги должны быть привязаны к способу регистрации поставщиков услуг.
Как анализировать?
Когда служба привязана к контейнеру, мы можем получить или проанализировать службу в любом месте приложения.
// We can do this with IoC
$fooService = app()->make('FooService');
$fooService->doSomething();
// It can also be reduced to one line of code
app()->make('FooService')->doSomething();Нам просто нужно сказать Ларавелу: “Помни о продовольственном обслуживании, давай его мне, когда он мне понадобится”. Вы заметили, что создание сервисов с помощью IoC делает код проще, понятнее и проще для чтения? Это изящество Laravel и облегчает тестирование вашего кода, потому что при тестировании вы можете заменить службу питания поддельным классом (я думаю, вы должны быть знакомы с тем, как его тестировать). Класс подделки в суде.
Интерфейсы привязки в контейнерах
В объектно-ориентированном программировании интерфейсы-это способ создания классов, которые должны соответствовать определенному планированию или ограничениям. Это помогает другим разработчикам создавать код, соответствующий ограничениям, установленным в вашем интерфейсе. Это заставляет их передавать допустимые параметры функциям и возвращать определенные типы данных, хотя их методы могут быть реализованы по-разному. Таким образом, вы можете легко определить, что разные реализации, наследующие один и тот же интерфейс, будут работать одинаково.
В контейнере Laravel мы можем привязать реализацию определенного интерфейса, таким образом, при анализе интерфейса мы в конечном итоге получим привязанный к нему конкретный класс.
$this->app->bind(FooInterface::class, FooClass::class);
Поэтому, когда FooInterface Успешно проанализирован, Ларавел был достаточно умен, чтобы дать нам его. Класс Foo Примеры.
А теперь представьте, что мы его написали. Интерфейс FooInterface Лучшие реализации называются Barclays И мы хотим его заменить. Фукласс Все, что нам нужно сделать, это:
$this->app->bind(FooInterface::class, BarClass::class);
Наш код все еще работает, потому что мы знаем Barclays Будет следовать нашему интерфейсу, даже если Barclays В отличие от ожидаемой производительности, мы можем переключиться обратно. Фукласс Это тот самый случай. Это хороший способ обновить код приложения без слишком большого количества регрессий.
Анализ зависимостей
Мы знаем, что Laravel может анализировать службы и интерфейсы, которые мы связываем в контейнерах, но он может сделать больше, чем это. Фактически, он также может автоматически анализировать зависимости этих сервисов для нас, не написав ни одной строки кода.
Представьте себе следующие классы услуг в нашем проекте.
bar = $bar;
}
/**
* Do something useful
*
* @return string
*/
public function doSomething()
{
return $this->bar->somethingToDo();
}
}Мы можем видеть Услуги общественного питания Нужна Обслуживание в баре Примеры. Как мы можем привязать его к контейнеру, чтобы, когда Laravel даст нам его? Услуги общественного питания Это также даст нам пример. Обслуживание в баре Примеры?
Вы можете подумать, что это решение может быть следующим:
$this->app->bind('Foo', new FooService(new BarService));Технически это достижимо, но на самом деле в этом нет необходимости. Laravel автоматически решает эту проблему за нас, используя мощную функцию отражения PHP. Так что вам просто нужно привязаться, как обычно:
$this->app->bind('Foo', FooService::class);Теперь, когда код будет проанализирован в Foo Laravel будет искать его. Услуги общественного питания Услуга, когда выясняется, что она нуждается в Обслуживание в баре Примеры услуг; Laravel будет искать их снова Обслуживание в баре Сервис и предоставить ему экземпляры объектов Услуги общественного питания Конструктор сервиса создает для нас полный экземпляр. Эти процессы не требуют от нас написания строки кода, это действительно удивительное и ясное мышление!!
Кроме того, описанный выше процесс обеспечит все зависимости. Итак, если Барная служба Службы также имеют свои собственные зависимости, поэтому они будут решены вышеуказанным способом.
Последние слова
Есть много замечательных вещей, которые можно обсудить и узнать о сервисном контейнере Laravel. Я надеюсь, что это небольшое введение даст вам некоторое вдохновение и поможет углубить ваше понимание контейнеров.
Я призываю вас прочитать больше [документов] ( https://laravel.com/docs/5.6/… )。
Спасибо вам за ваше чтение.
Оригинал: “https://developpaper.com/laravel-service-container/”