Сервис провайдер
Содержание:
Введение
Сервис провайдеры — это центральное место загрузки всего приложения Laravel. Загрузка приложения, ядра Ларавел проходит через сервис провайдеры.
Но что мы имеем в виду под словом загрузка? В целом, это регистрация, включая связывание сервис контейнера, слушатели событий, средний слой и даже пути. Сервис провайдеры занимают центральное место в настройке вашего приложения.
Если вы откроете файл config/app.php
, вы увидите массив providers
.
Здесь перечислены все сервис провайдеры, которые будут загружены в вашем приложении. Примите к сведенью, что
многие из провайдеров отсроченные, это означает, что они загружаются не при каждом запросе, а только при
необходимости.
В этом обзеро вы научитесь писать ваше сервис провайдеры и регистрировать их в вашем приложении Laravel.
Написание сервис-провайдеров
Все сервис провайдеры расширяют класс Illuminate\Support\ServiceProvider
. Большинство сервис
провайдеров содержат методы register
и boot
. Внутри метода register
вы должны только связывать классы в сервис контейнеры. Даже не пытайтесь регистрировать слушателей,
маршруты или другие части функционала внутри метода register
.
Вы можете создать новый провайдер через консоль Artisan командой make:provider
:
php artisan make:provider RiakServiceProvider
Метод Register
Как упоминалось ранее, через метод register
вы должны только связывать вещи в сервис контейнер.
В противном случае, вы можете случайно использовать сервис, который предостовялется сервис провайдером, но
ещё не загружен.
Давайте взглянем на типовой сервис провайдер. У вас всегда есть доступ к переменной $app
,
которая продоставляет доступ к сервис контейнеру;
<?php
namespace App\Providers;
use Riak\Connection;
use Illuminate\Support\ServiceProvider;
class RiakServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
$this->app->singleton(Connection::class, function ($app) {
return new Connection(config('riak'));
});
}
}
Этот сервис провайдер определён в методе register
, и использует метод для определения реализации
Riak\Connection
в сервис контейнере.
Методы bindings
и singletons
Если ваш сервис провайдер регистрирует большое количество простых связываний, вы можете использовать
bindings
и singletons
вместо зарегистрированных вручную связи по отдельности.
Когда сервис провайдер загружен фреймворком, запустится автоматическая проверка и все связи будут
зарегистрированы.
<?php
namespace App\Providers;
use App\Contracts\ServerProvider;
use App\Contracts\DowntimeNotifier;
use App\Services\ServerToolsProvider;
use Illuminate\Support\ServiceProvider;
use App\Services\PingdomDowntimeNotifier;
use App\Services\DigitalOceanServerProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* All of the container bindings that should be registered.
*
* @var array
*/
public $bindings = [
ServerProvider::class => DigitalOceanServerProvider::class,
];
/**
* All of the container singletons that should be registered.
*
* @var array
*/
public $singletons = [
DowntimeNotifier::class => PingdomDowntimeNotifier::class,
ServerToolsProvider::class => ServerToolsProvider::class,
];
}
Метод Boot
>
Итак, что если нам необходимо зарегистрировать
представления composers внутри нашего
сервис провайдера? Для этого можно использовать метод boot
. Этот метод вызывается
после регистрации всех сервис провайдеров, это означает, что у вас есть доступ ко всем
другим службам, которые были зарегистрированы фреймворком:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
view()->composer('view', function () {
//
});
}
}
Использование внедрения зависимости для метода Boot
Вы можете вписывать зависимости для метода boot
вашего сервис провайдера. Сервис контейнер
автоматически внедрит зависимость, которая вам нужна.
use Illuminate\Contracts\Routing\ResponseFactory;
public function boot(ResponseFactory $response)
{
$response->macro('caps', function ($value) {
//
});
}
Регистрация провайдеров
Все сервис провайдеры зарегистрированы в файле config/app.php
. Этот файл содержит массив
providers
, в котором перечисленны все имена классов ваших сервис провайдеров. По умолчанию,
список сервис провайдеров для ядра Laravel перечислен в этом массиве. Эти провайдеры запускают компоненты
ядра Laravel, такие как почта, очереди, кэш и другое.
Чтобы зарегистрировать провайдер, добавьте в массив:
'providers' => [
// Other Service Providers
App\Providers\ComposerServiceProvider::class,
],
Отложенные провайдеры
Если ваш провайдер только регистрирует связывание сервис контейнера, вы можете отложить регистрацию до того момента, когда потребуется одна из зарегистрированных связей. Отсрочка загрузки таких провайдеров даст улучшение производительности вашего приложения, потому что они не будут загружаться при каждом запросе.
Laravel собирает и хранит список всех отложенных сервисов отдельно. Только когда вы попытаетесь использовать один из этих сервисов, Ларавел загрузит такой сервис.
Чтобы отложить загрузку поставщика, расширьте интерфейс
\Illuminate\Contracts\Support\DeferrableProvider
и определите метод provides
.
Этот метод должен вернуть зарегистрированный провайдером связи сервис контейнера:
<?php
namespace App\Providers;
use Riak\Connection;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Support\DeferrableProvider;
class RiakServiceProvider extends ServiceProvider implements DeferrableProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(Connection::class, function ($app) {
return new Connection($app['config']['riak']);
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return [Connection::class];
}
}