Skip to content

Commit

Permalink
providers
Browse files Browse the repository at this point in the history
  • Loading branch information
jhaoda committed Jan 29, 2015
1 parent 298c9c2 commit 2e475fc
Showing 1 changed file with 25 additions and 25 deletions.
50 changes: 25 additions & 25 deletions providers.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
git 6891fd2c068c98022b89a7dbc728e6681a5bfd87
git 41fca1588af2175b2fe340a3c332322db7646963

---

Expand All @@ -8,24 +8,27 @@ git 6891fd2c068c98022b89a7dbc728e6681a5bfd87
- [Использование провайдеров](#basic-provider-example)
- [Регистрация провайдеров](#registering-providers)
- [Отложенные провайдеры](#deferred-providers)
- [Команда создания провайдера](#generating-service-providers)

<a name="introduction"></a>
## Введение

Service providers (сервис-провайдеры, дословно - "поставщики услуг") занимают центральное место в архитектуре Laravel. Они предназначены для первоначальной загрузки (bootstraping) приложения. Ваше приложение, а также сервисы самого фреймворка загружаются через сервис-провайдеры.

Что конкретно означает термин "первоначальная загрузка" или "bootsraping" ? Главным образом это **регистрация** некоторых вещей - таких как биндинги в IoC-контейнер (фасадов и т.д.), слушателей событий (event listeners), фильтров роутов (route filters) и самих роутов (routes). Сервис-провайдеры - центральное место для конфигурирования вашего приложения.
Что конкретно означает термин "первоначальная загрузка" или "bootsraping"? Главным образом это **регистрация** некоторых вещей - таких как биндинги в IoC-контейнер (фасадов и т.д.), слушателей событий (event listeners), фильтров роутов (route filters) и самих роутов (routes). Сервис-провайдеры - центральное место для конфигурирования вашего приложения.

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

Можно и нужно создавать свои собственные сервис-провайдеры для загрузки и настройки различных частей своего приложения.

<a name="basic-provider-example"></a>
## Использование провайдеров

Сервис-провайдеры должны расширять (extends) класс `Illuminate\Support\ServiceProvider`. Это абстрактный класс, который требует, чтобы в наследуемом классе был метод `register()`. В методе `register()` вы можете **только** регистрировать свои классы (bindings) в [сервис-контейнере](/docs/master/container), слушателей событий (event listeners), роуты и фильтры роутов там регистрировать **нельзя**.
Сервис-провайдеры должны расширять (extends) класс `Illuminate\Support\ServiceProvider`. Это абстрактный класс, который требует, чтобы в наследуемом классе был метод `register()`. В методе `register()` вы можете **только** регистрировать свои классы (bindings) в [сервис-контейнере](/docs/master/container). Слушателей событий (event listeners), роуты и фильтры роутов там регистрировать **нельзя**.

С помощью Artisan можно легко создать нового провайдера, используя команду `make:provider`:

php artisan make:provider RiakServiceProvider

### Метод register()

Вот так может выглядеть простейший сервис-провайдер:
Expand All @@ -52,30 +55,29 @@ Service providers (сервис-провайдеры, дословно - "пос

}

В `register()` мы регистрируем (bind) как singleton (т.е. класс не будет переинициализироваться после вызова из контейнера) в сервис-контейнере класс работы с базой данных Riak. Если для вас этот код выглядит абракадаброй, не беспокойтесь, работу [сервис-контейнера мы рассмотрим позже](/docs/master/container).
В `register()` мы регистрируем (bind) как singleton (т.е. класс не будет переинициализироваться после вызова из контейнера) в сервис-контейнере класс работы с базой данных Riak. Если для вас этот код выглядит абракадаброй, не беспокойтесь, работу [сервис-контейнера](/docs/master/container) мы рассмотрим позже.

Неймспейс `App\Providers` , в котором находится этот класс сервис-провайдера - дефолтное место для хранения сервис-провайдеров вашего Laravel-приложения, но вы можете располагать свои сервис-провайдеры где угодно внутри вашей PSR-4 папки (если вы не меняли `composer.json`, то это папка `app`).
Неймспейс `App\Providers`, в котором находится этот класс сервис-провайдера - дефолтное место для хранения сервис-провайдеров вашего Laravel-приложения, но вы можете располагать свои сервис-провайдеры где угодно внутри вашей PSR-4 папки (если вы не меняли `composer.json`, то это папка `app`).

### Метод boot()

Когда вызвались методы `register()` всех сервис-провайдеров приложения, вызывается метод `boot()` сервис-провайдеров. Там уже можно использовать весь существующий функционал классов фреймворка и вашего приложения - регистрировать слушателей событий, подключать роуты и т.п. .
Когда вызвались методы `register()` всех сервис-провайдеров приложения, вызывается метод `boot()` сервис-провайдеров. Там уже можно использовать весь существующий функционал классов фреймворка и вашего приложения - регистрировать слушателей событий, подключать роуты и т.п.

<?php namespace App\Providers;

use Event;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Events\Dispatcher;

class EventServiceProvider extends ServiceProvider {

/**
* Perform post-registration booting of services.
*
* @param Dispatcher $events
* @return void
*/
public function boot(Dispatcher $events)
{
$events->listen('SomeEvent', 'SomeEventHandler');
Event::listen('SomeEvent', 'SomeEventHandler');
}

/**
Expand All @@ -90,8 +92,15 @@ Service providers (сервис-провайдеры, дословно - "пос

}

Обратите внимание, что сервис-контейнер, вызывая метод `boot()`, сам проинжектит те зависимости, которые вы зададите, в частности, Dispatcher.
Обратите внимание, что сервис-контейнер, вызывая метод `boot()`, сам инъектирует те зависимости, которые вы зададите, в частности, Dispatcher.

use Illuminate\Contracts\Events\Dispatcher;

public function boot(Dispatcher $events)
{
$events->listen('SomeEvent', 'SomeEventHandler');
}

<a name="registering-providers"></a>
## Регистрация провайдеров

Expand All @@ -100,17 +109,17 @@ Service providers (сервис-провайдеры, дословно - "пос
Чтобы зарегистрировать свой сервис-провайдер, добавьте название класса в этот массив:

'providers' => [
'App\Providers\EventServiceProvider',

// другие сервис-провайдеры

'App\Providers\AppServiceProvider',
],

<a name="deferred-providers"></a>
## Отложенные провайдеры

Если ваш провайдер **только** регистрирует (bind) классы в [сервис-контейнере](/docs/master/container), то вы можете отложить вызов его метода `register()` до момента, когда эти классы будут затребованы из сервис-контейнера. Это позволит не дергать файловую систему каждый запрос в попытках загрузить файл с нужным классом с диска.

Для того, чтобы сделать сервис-провайдер отложенным, установите свойство `defer` в `true` и определить метод `provides()` , чтобы фреймворк знал, какие классы биндятся (регистрируются в сервис-контейнере, "связываются") в вашем провайдере.
Для того, чтобы сделать сервис-провайдер отложенным, установите свойство `defer` в `true` и определить метод `provides()`, чтобы фреймворк знал, какие классы биндятся (регистрируются в сервис-контейнере, "связываются") в вашем провайдере.

<?php namespace App\Providers;

Expand Down Expand Up @@ -151,13 +160,4 @@ Service providers (сервис-провайдеры, дословно - "пос

}

Когда в процессе работы приложению понадобится класс `Riak\Contracts\Connection`, он вызовет метод `register()` сервис провайдера `RiakServiceProvider`.

Laravel в процессе запуска собирает данные об отложенных сервис-провайдерах и классах, которые ими биндятся - и держит их в файле `storage/meta/services.json`

<a name="generating-service-providers"></a>
## Команда создания провайдера

Сервис-провайдер можно создать artisan-командой `make:provider` :

php artisan make:provider "App\Providers\RiakServiceProvider"
Laravel в процессе запуска собирает данные об отложенных сервис-провайдерах и классах, которые ими биндятся, и когда в процессе работы приложению понадобится класс `Riak\Contracts\Connection`, он вызовет метод `register()` сервис провайдера `RiakServiceProvider`.

0 comments on commit 2e475fc

Please sign in to comment.