Skip to content

Commit

Permalink
Update providers.md
Browse files Browse the repository at this point in the history
  • Loading branch information
webns committed Jun 15, 2020
1 parent f55de05 commit c5a4d0d
Showing 1 changed file with 50 additions and 20 deletions.
70 changes: 50 additions & 20 deletions providers.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
git e73c40f0dea4db1205c83584d6c5b544b5ff1683
git b01a1c4ccfcd940447ea25457eff41e056628e88

---

Expand All @@ -7,7 +7,7 @@ git e73c40f0dea4db1205c83584d6c5b544b5ff1683
- [Введение](#introduction)
- [Использование сервис-провайдеров](#writing-service-providers)
- [Метод Register](#the-register-method)
- [Метод Boot ](#the-boot-method)
- [Метод Boot](#the-boot-method)
- [Регистрация провайдеров](#registering-providers)
- [Отложенные провайдеры](#deferred-providers)

Expand All @@ -18,7 +18,7 @@ git e73c40f0dea4db1205c83584d6c5b544b5ff1683

Но что мы понимаем под "первоначальной загрузкой"? В общих чертах, мы имеем ввиду **регистрацию** таких вещей, как биндингов в IoC-контейнер (фасадов и т.д.), слушателей событий, фильтров роутов и даже самих роутов. Сервис-провайдеры - центральное место для конфигурирования вашего приложения.

Если вы откроете файл `config/app.php`, поставляемый с Laravel, то увидите массив `providers`. В нём перечислены все классы сервис-провайдеров, которые загружаются для вашего приложения. Конечно, многие из них являются "отложенными" провайдерами, т.е. они не загружаются при каждом запросе, а только при необходимости.
Если вы откроете файл `config/app.php`, поставляемый с Laravel, то увидите массив `providers`. В нём перечислены все классы сервис-провайдеров, которые загружаются для вашего приложения. Обратите внимание, что многие из них являются "отложенными" провайдерами, т.е. они не загружаются при каждом запросе, а только при необходимости.

В этом обзоре вы узнаете, как создавать свои собственные сервис-провайдеры и регистрировать их в своём приложении.

Expand All @@ -42,13 +42,13 @@ git e73c40f0dea4db1205c83584d6c5b544b5ff1683

namespace App\Providers;

use Riak\Connection;
use Illuminate\Support\ServiceProvider;
use Riak\Connection;

class RiakServiceProvider extends ServiceProvider
{
/**
* Регистрация привязки в контейнере.
* Register any application services.
*
* @return void
*/
Expand All @@ -62,10 +62,47 @@ git e73c40f0dea4db1205c83584d6c5b544b5ff1683

Этот сервис-провайдер только определяет метод `register` и использует его, чтобы определить реализацию `Riak\Connection` в сервис-контейнере. Если вы не понимаете как работает сервис-контейнер, прочитайте [его документацию](/docs/{{version}}/container).

#### Свойства `bindings` и `singletons`

Если ваш сервис провайдер регистрирует много простых связываний, вы можете использовать свойства `bindings` и `singletons` вместо того, чтобы вручную регистрировать каждое связывание. Когда сервис провайдер загружается фреймворком, он автоматически проверяет эти свойства и создает связывания:

<?php

namespace App\Providers;

use App\Contracts\DowntimeNotifier;
use App\Contracts\ServerProvider;
use App\Services\DigitalOceanServerProvider;
use App\Services\PingdomDowntimeNotifier;
use App\Services\ServerToolsProvider;
use Illuminate\Support\ServiceProvider;

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,
];
}

<a name="the-boot-method"></a>
### Метод Boot

А что, если нам нужно зарегистрировать вью-композер в нашем сервис-провайдере? Это нужно делать в методе `boot`. **Этот метод вызывают после того, как были зарегистрированы все другие сервис-провайдеры**. И это значит, что у вас есть доступ ко всем другим сервисам, которые были зарегистрированы фреймворком:
А что, если нам нужно зарегистрировать [вью-композер](/docs/{{version}}/views#view-composers) в нашем сервис-провайдере? Это нужно делать в методе `boot`. **Этот метод вызывают после того, как были зарегистрированы все другие сервис-провайдеры**. И это значит, что у вас есть доступ ко всем другим сервисам, которые были зарегистрированы фреймворком:

<?php

Expand Down Expand Up @@ -121,26 +158,20 @@ git e73c40f0dea4db1205c83584d6c5b544b5ff1683

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

Для того, чтобы сделать сервис-провайдер отложенным, установите свойство `defer` равным `true` и определите метод `provides`. Метод `provides` должен вернуть привязки сервис-контейнера, зарегистрированные в вашем провайдере:
Чтобы отложить загрузку сервис-провайдера, реализуем интерфейс `\Illuminate\Contracts\Support\DeferrableProvider` и определим метод `provides`. Метод `provides` должен возвращать связи сервис-контейнера, регистрируемые в провайдере:

<?php

namespace App\Providers;

use Riak\Connection;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\ServiceProvider;
use Riak\Connection;

class RiakServiceProvider extends ServiceProvider
class RiakServiceProvider extends ServiceProvider implements DeferrableProvider
{
/**
* Задаёт отложена ли загрузка провайдера.
*
* @var bool
*/
protected $defer = true;

/**
* Регистрация сервис-провайдера.
* Register any application services.
*
* @return void
*/
Expand All @@ -152,13 +183,12 @@ Laravel компилирует и хранит список всех серви
}

/**
* Получить предоставляемые сервисы от провайдера.
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return [Connection::class];
}

}
}

0 comments on commit c5a4d0d

Please sign in to comment.