Может войдёшь?
Черновики Написать статью Профиль

Поставщики услуг

перевод документация 5.х

  1. 1. Введение
  2. 2. Создание сервис-провайдеров
    1. 2.1. Метод register()
    2. 2.2. Метод boot()
  3. 3. Регистрация провайдеров
  4. 4. Отложенные провайдеры
Этот перевод актуален для англоязычной документации на (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

Поставщики услуг, или сервис-провайдеры (service providers), лежат в основе «первоначальной загрузки» всего Laravel. И ваше приложение, и все базовые сервисы Laravel загружаются через сервис-провайдеры.

Но что мы понимаем под «первоначальной загрузкой»? В основном это регистрация таких вещей как привязки сервис-контейнера, слушатели событий, посредники и даже маршруты. Сервис-провайдеры — центральное место для настройки вашего приложения.

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

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

Создание сервис-провайдеров

Все сервис-провайдеры наследуют класс Illuminate\Support\ServiceProvider. Этот абстрактный класс требует, чтобы вы определили по крайней мере один метод в вашем провайдере — метод PHPregister(). В методе PHPregister() вы должны только привязывать свои классы в сервис-контейнер. Никогда не пытайтесь зарегистрировать в этом методе слушателей событий, маршруты и какие-либо другие возможности.

С помощью Artisan CLI можно легко создать новый провайдер командой shmake:provider:

shphp artisan make:provider RiakServiceProvider

Метод register()

Как уже было сказано, внутри метода PHPregister() вы должны только привязывать свои классы в сервис-контейнер. Никогда не пытайтесь зарегистрировать в этом методе слушателей событий, маршруты и какие-либо другие возможности. Иначе может получиться, что вы обратитесь к сервису, предоставляемому сервис-провайдером, который ещё не был загружен.

Давайте взглянем на простой сервис-провайдер:

PHP
<?php

namespace App\Providers;

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

class 
RiakServiceProvider extends ServiceProvider
{
  
/**
   * Регистрация привязка в контейнере.
   *
   * @return void
   */
  
public function register()
  {
    
$this->app->singleton('Riak\Contracts\Connection', function ($app) {
      return new 
Connection(config('riak'));
    });
  }
}

Этот сервис-провайдер только определяет метод PHPregister() и использует его, чтобы определить реализацию Riak\Contracts\Connection в сервис-контейнере. Если вы не поняли, как работает сервис-контейнер, прочитайте его документацию.

+ 5.0

добавлено в 5.0 ()

Все сервис-провайдеры Laravel по-умолчанию размещены в namespace PHPApp\Providers. Там же разместится и наш класс. Но, естественно, вы всегда можете поменять его местоположение. Ваши сервис-провайдеры могут быть размещены где угодно, так чтобы Composer автоматически их загружал.

Метод boot()

А что, если нам нужно зарегистрировать построитель представления в нашем сервис-провайдере? Это нужно делать в методе PHPboot. Этот метод вызывают после того, как все другие сервис-провайдеры были зарегистрированы. Это значит, что у вас есть доступ ко всем другим сервисам, которые были зарегистрированы фреймворком.

PHP
<?php

namespace App\Providers;

use 
Illuminate\Support\ServiceProvider;

class 
EventServiceProvider extends ServiceProvider
{
  
/**
   * Загрузка сервисов после регистрации.
   *
   * @return void
   */
  
public function boot()
  {
    
view()->composer('view', function () {
      
//
    
});
  }

  
/**
   * Привязка к контейнеру.
   *
   * @return void
   */
  
public function register()
  {
    
//
  
}
}

Внедрение зависимостей метода PHPboot()

Мы можем указать зависимости для нашего метода PHPboot(). Сервис-контейнер автоматически внедрит те зависимости, которые вы зададите:

PHP
use Illuminate\Contracts\Routing\ResponseFactory;

public function 
boot(ResponseFactory $factory)
{
  
$factory->macro('caps', function ($value) {
    
//
  
});
}

Регистрация провайдеров

Все сервис-провайдеры регистрируются в файле PHPconfig/app.php путем добавления в массив providers. Изначально в нём указан набор базовых сервис-провайдеров Laravel. Эти провайдеры загружают базовые компоненты Laravel, такие как обработчик почты, очередь, кэш и другие.

Чтобы зарегистрировать свой сервис-провайдер, просто добавьте его в этот массив:

PHP
'providers' => [
  
// Другие сервис-провайдеры

  
App\Providers\AppServiceProvider::class,
],

Отложенные провайдеры

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

Для того, чтобы сделать сервис-провайдер отложенным, установите свойство defer в true и определите метод PHPprovides(). Метод PHPprovides() возвращает привязки сервис-контейнера, зарегистрированные в вашем провайдере:

PHP
<?php

namespace App\Providers;

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

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

  
/**
   * Регистрация сервис-провайдера.
   *
   * @return void
   */
  
public function register()
  {
    
$this->app->singleton('Riak\Contracts\Connection', function ($app) {
      return new 
Connection($app['config']['riak']);
    });
  }

  
/**
   * Получить сервисы от провайдера.
   *
   * @return array
   */
  
public function provides()
  {
    return [
'Riak\Contracts\Connection'];
  }

}

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

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.