введение в laravel 5

36
Введение в Laravel 5 Сервис-контейнер в Laravel

Upload: -

Post on 23-Jan-2017

45 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: введение в Laravel 5

Введение в Laravel 5Сервис-контейнер в Laravel

Page 2: введение в Laravel 5

Сервис-контейнерсредство для управлениязависимостями классов

ивнедрения зависимостей.

Page 3: введение в Laravel 5

Внедрение зависимостей (DI)конструктор или метод-сеттер

Page 4: введение в Laravel 5

namespace App\Jobs;

class PurchasePodcast implements SelfHandling{ protected $mailer;

public function __construct(Mailer $mailer) { $this->mailer = $mailer; }

Page 5: введение в Laravel 5

сервис внедрёнможем легко подменить его с другой реализацией

Page 6: введение в Laravel 5

Можно легко создать «mock» или фиктивную реализацию при тестировании приложения

Page 7: введение в Laravel 5

Связывание

Page 8: введение в Laravel 5

Все привязки сервис-контейнеров будут зарегистрированы в сервис-провайдерах

Page 9: введение в Laravel 5

Сервис-провайдеры - основа «первоначальной загрузки» Laravel

Приложение и все базовые сервисы загружаются через сервис-провайдеры

Page 10: введение в Laravel 5

«Первоначальная загрузка»регистрация таких вещей как:

● привязки сервис-контейнера● слушатели событий (event listener)● посредники (middleware)● маршруты (routes)

Page 11: введение в Laravel 5

Сервис-провайдерыцентральное место для настройки приложения

Page 12: введение в Laravel 5

Если открытьconfig/app.php

поставляемый с Laravelто увидим… (deferred)

Page 13: введение в Laravel 5

'providers' => [

/* * Laravel Framework Service Providers... */ Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, Illuminate\Bus\BusServiceProvider::class, Illuminate\Cache\CacheServiceProvider::class, Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,

Page 14: введение в Laravel 5

Если классы не зависят от интерфейсовне надо связывать их в контейнере

Page 15: введение в Laravel 5

Не нужно объяснять контейнеру, как создавать эти объектыСервисы отражения PHP (Reflection)

Page 16: введение в Laravel 5

В сервис-провайдере всегда есть доступ к контейнеру через переменную экземпляра $this->app

Page 17: введение в Laravel 5

Привязка методом bind()

Первый аргумент имя класса или интерфейсаВторой замыкание (Closure), которое возвращает

экземпляр класса

Page 18: введение в Laravel 5

$this->app->bind('HelpSpot\API', function ($app) { return new HelpSpot\API($app['HttpClient']);});

Page 19: введение в Laravel 5

Получаем сам контейнер в виде аргумента «резолвера»Затем можно использовать контейнер, чтобы получать под-

зависимости создаваемого объекта

Page 20: введение в Laravel 5

Связывание синглтона

Page 21: введение в Laravel 5

singleton()привязывает класс или интерфейс к контейнеру

должен быть создан только один раз

Page 22: введение в Laravel 5

$this->app->singleton('FooBar', function ($app) { return new FooBar($app['SomethingElse']);});

Page 23: введение в Laravel 5

Связывание существующего экземпляра класса с контейнером

Page 24: введение в Laravel 5

instance()Привязка существующего экземпляра к контейнеру

экземпляр будет всегда возвращаться при последующих обращениях к контейнеру

Page 25: введение в Laravel 5

$fooBar = new FooBar(new SomethingElse);

$this->app->instance('FooBar', $fooBar);

Page 26: введение в Laravel 5

Связывание интерфейса с реализацией

Page 27: введение в Laravel 5

<?phpnamespace App\Handlers\Commands;

use App\Commands\CreateOrder;use Pusher\Client as PusherClient;

class CreateOrderHandler {

/** * Экземпляр клиента Pusher SDK. */ protected $pusher;

public function __construct(PusherClient $pusher) { $this->pusher = $pusher; }

Page 28: введение в Laravel 5

<?phpnamespace App\Contracts;

interface EventPusher {

/** * Push a new event to all clients. * * @param string $event * @param array $data * @return void */ public function push($event, array $data);

}

Page 29: введение в Laravel 5

$this->app->bind('App\Contracts\EventPusher', 'App\Services\RedisEventPusher');

Page 30: введение в Laravel 5

<?phpnamespace App\Handlers\Commands;

use App\Contracts\EventPusher;

class CreateOrderHandler {

/** * Экземпляр клиента Pusher SDK. */ protected $pusher;

/** * Создание нового экземпляра класса. * * @param EventPusher $pusher * @return void */ public function __construct(EventPusher $pusher) { $this->pusher = $pusher; }

Page 31: введение в Laravel 5

Контекстное связывание

Page 32: введение в Laravel 5

$this->app->when('App\Handlers\Commands\CreateOrderHandler') ->needs('App\Contracts\EventPusher') ->give('App\Services\PubNubEventPusher');

$this->app->when('App\Handlers\Commands\CreateOrderHandler') ->needs('App\Contracts\EventPusher') ->give(function () { // Извлечение зависимости... });

Page 33: введение в Laravel 5

Получение из контейнера

Page 34: введение в Laravel 5

$fooBar = $this->app->make('FooBar');

$fooBar = $this->app['FooBar']; // ArrayAccess

public function __construct(EventPusher $pusher)

Варианты

Page 35: введение в Laravel 5

События контейнера

Page 36: введение в Laravel 5

$this->app->resolving(function ($object, $app) { // Вызывается при извлечении объекта любого типа...});

$this->app->resolving(FooBar::class, function (FooBar $fooBar, $app) { // Вызывается при извлечении объекта типа "FooBar"...});