введение в laravel 5
TRANSCRIPT
![Page 1: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/1.jpg)
Введение в Laravel 5Сервис-контейнер в Laravel
![Page 2: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/2.jpg)
Сервис-контейнерсредство для управлениязависимостями классов
ивнедрения зависимостей.
![Page 3: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/3.jpg)
Внедрение зависимостей (DI)конструктор или метод-сеттер
![Page 4: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/4.jpg)
namespace App\Jobs;
class PurchasePodcast implements SelfHandling{ protected $mailer;
public function __construct(Mailer $mailer) { $this->mailer = $mailer; }
![Page 5: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/5.jpg)
сервис внедрёнможем легко подменить его с другой реализацией
![Page 6: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/6.jpg)
Можно легко создать «mock» или фиктивную реализацию при тестировании приложения
![Page 7: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/7.jpg)
Связывание
![Page 8: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/8.jpg)
Все привязки сервис-контейнеров будут зарегистрированы в сервис-провайдерах
![Page 9: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/9.jpg)
Сервис-провайдеры - основа «первоначальной загрузки» Laravel
Приложение и все базовые сервисы загружаются через сервис-провайдеры
![Page 10: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/10.jpg)
«Первоначальная загрузка»регистрация таких вещей как:
● привязки сервис-контейнера● слушатели событий (event listener)● посредники (middleware)● маршруты (routes)
![Page 11: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/11.jpg)
Сервис-провайдерыцентральное место для настройки приложения
![Page 12: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/12.jpg)
Если открытьconfig/app.php
поставляемый с Laravelто увидим… (deferred)
![Page 13: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/13.jpg)
'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](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/14.jpg)
Если классы не зависят от интерфейсовне надо связывать их в контейнере
![Page 15: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/15.jpg)
Не нужно объяснять контейнеру, как создавать эти объектыСервисы отражения PHP (Reflection)
![Page 16: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/16.jpg)
В сервис-провайдере всегда есть доступ к контейнеру через переменную экземпляра $this->app
![Page 17: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/17.jpg)
Привязка методом bind()
Первый аргумент имя класса или интерфейсаВторой замыкание (Closure), которое возвращает
экземпляр класса
![Page 18: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/18.jpg)
$this->app->bind('HelpSpot\API', function ($app) { return new HelpSpot\API($app['HttpClient']);});
![Page 19: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/19.jpg)
Получаем сам контейнер в виде аргумента «резолвера»Затем можно использовать контейнер, чтобы получать под-
зависимости создаваемого объекта
![Page 20: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/20.jpg)
Связывание синглтона
![Page 21: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/21.jpg)
singleton()привязывает класс или интерфейс к контейнеру
должен быть создан только один раз
![Page 22: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/22.jpg)
$this->app->singleton('FooBar', function ($app) { return new FooBar($app['SomethingElse']);});
![Page 23: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/23.jpg)
Связывание существующего экземпляра класса с контейнером
![Page 24: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/24.jpg)
instance()Привязка существующего экземпляра к контейнеру
экземпляр будет всегда возвращаться при последующих обращениях к контейнеру
![Page 25: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/25.jpg)
$fooBar = new FooBar(new SomethingElse);
$this->app->instance('FooBar', $fooBar);
![Page 26: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/26.jpg)
Связывание интерфейса с реализацией
![Page 27: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/27.jpg)
<?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](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/28.jpg)
<?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](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/29.jpg)
$this->app->bind('App\Contracts\EventPusher', 'App\Services\RedisEventPusher');
![Page 30: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/30.jpg)
<?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](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/31.jpg)
Контекстное связывание
![Page 32: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/32.jpg)
$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](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/33.jpg)
Получение из контейнера
![Page 34: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/34.jpg)
$fooBar = $this->app->make('FooBar');
$fooBar = $this->app['FooBar']; // ArrayAccess
public function __construct(EventPusher $pusher)
Варианты
![Page 35: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/35.jpg)
События контейнера
![Page 36: введение в Laravel 5](https://reader036.vdocuments.site/reader036/viewer/2022062522/5885c28e1a28ab6f168b70c1/html5/thumbnails/36.jpg)
$this->app->resolving(function ($object, $app) { // Вызывается при извлечении объекта любого типа...});
$this->app->resolving(FooBar::class, function (FooBar $fooBar, $app) { // Вызывается при извлечении объекта типа "FooBar"...});