نسخه:

ارائه دهندگان خدمات

معرفی

ارائه دهندگان خدمات مرکز اصلی بوت استرپینگ برنامه های لاراول هستند. برنامه شخصی شما و همچنین تمام خدمات اصلی لاراول از طریق ارائه دهندگان خدمات بوت استرپ می شوند.

اما، منظور ما از "bootstrapped" چیست؟ به طور کلی، منظور ما ثبت چیزهایی است، از جمله ثبت اتصالات کانتینر سرویس، شنوندگان رویداد، فیلترها و حتی مسیرها. ارائه دهندگان خدمات مرکز اصلی برای پیکربندی برنامه شما هستند.

config/app.php اگر فایل همراه لاراول را باز کنید ، یک providers آرایه خواهید دید. اینها همه کلاس های ارائه دهنده خدمات هستند که برای برنامه شما بارگذاری می شوند. البته، بسیاری از آنها ارائه دهندگان "معویق" هستند، به این معنی که در هر درخواستی بارگذاری نمی شوند، بلکه فقط زمانی که خدماتی که ارائه می دهند واقعاً مورد نیاز باشد.

در این نمای کلی شما یاد خواهید گرفت که چگونه ارائه دهندگان خدمات خود را بنویسید و آنها را در برنامه لاراول خود ثبت کنید.

مثال ارائه دهنده پایه

همه ارائه دهندگان خدمات Illuminate\Support\ServiceProvider کلاس را گسترش می دهند. این کلاس انتزاعی نیاز دارد که حداقل یک متد را در ارائه دهنده خود تعریف کنید: register . در register روش، شما فقط باید چیزها را به کانتینر سرویس متصل کنید . هرگز نباید سعی کنید شنوندگان رویداد، مسیرها یا هر بخش دیگر از عملکرد را در register متد ثبت کنید.

Artisan CLI می تواند به راحتی یک ارائه دهنده جدید از طریق make:provider دستور ایجاد کند:

php artisan make:provider RiakServiceProvider

روش ثبت نام

حال، بیایید نگاهی به ارائه‌دهنده خدمات اولیه بیندازیم:

<?php namespace App\Providers;
 
use Riak\Connection;
use Illuminate\Support\ServiceProvider;
 
class RiakServiceProvider extends ServiceProvider {
 
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
$this->app->singleton('Riak\Contracts\Connection', function($app)
{
return new Connection($app['config']['riak']);
});
}
 
}

این ارائه دهنده خدمات فقط یک register متد را تعریف می کند و از آن روش برای تعریف پیاده سازی Riak\Contracts\Connection در کانتینر سرویس استفاده می کند. اگر نمی‌دانید کانتینر سرویس چگونه کار می‌کند، نگران نباشید، ما به زودی آن را پوشش خواهیم داد .

این کلاس در زیر فضای نام قرار می گیرد App\Providers زیرا مکان پیش فرض ارائه دهندگان خدمات در لاراول است. با این حال، شما مختار هستید که این را به دلخواه تغییر دهید. ارائه دهندگان خدمات شما ممکن است در هر جایی قرار بگیرند که Composer بتواند آنها را به طور خودکار بارگیری کند.

روش بوت

بنابراین، اگر ما نیاز به ثبت شنونده رویداد در ارائه دهنده خدمات خود داشته باشیم، چه؟ این باید در چارچوب روش انجام شود boot . این روش پس از ثبت نام همه ارائه دهندگان خدمات دیگر فراخوانی می شود ، به این معنی که شما به تمام سرویس های دیگری که توسط چارچوب ثبت شده اند دسترسی دارید.

<?php namespace App\Providers;
 
use Event;
use Illuminate\Support\ServiceProvider;
 
class EventServiceProvider extends ServiceProvider {
 
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Event::listen('SomeEvent', 'SomeEventHandler');
}
 
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
//
}
 
}

ما می توانیم وابستگی های متد خود را تایپ کنیم boot . ظرف سرویس به طور خودکار وابستگی هایی را که نیاز دارید تزریق می کند:

use Illuminate\Contracts\Events\Dispatcher;
 
public function boot(Dispatcher $events)
{
$events->listen('SomeEvent', 'SomeEventHandler');
}

ثبت نام ارائه دهندگان

همه ارائه دهندگان خدمات در config/app.php فایل پیکربندی ثبت شده اند. این فایل حاوی providers آرایه ای است که در آن می توانید نام ارائه دهندگان خدمات خود را فهرست کنید. به طور پیش فرض، مجموعه ای از ارائه دهندگان خدمات اصلی لاراول در این آرایه فهرست شده است. این ارائه دهندگان اجزای اصلی لاراول مانند میلر، صف، کش و غیره را بوت استرپ می کنند.

برای ثبت ارائه دهنده خود، به سادگی آن را به آرایه اضافه کنید:

'providers' => [
// Other Service Providers
 
'App\Providers\AppServiceProvider',
],

ارائه دهندگان معوق

اگر ارائه دهنده شما فقط اتصالات را در کانتینر سرویس ثبت می کند ، می توانید ثبت آن را تا زمانی که واقعاً به یکی از اتصالات ثبت شده نیاز باشد به تعویق بیندازید. به تعویق انداختن بارگیری چنین ارائه دهنده ای عملکرد برنامه شما را بهبود می بخشد، زیرا در هر درخواستی از سیستم فایل بارگیری نمی شود.

برای به تعویق انداختن بارگیری یک ارائه دهنده، defer ویژگی را روی آن تنظیم کرده true و یک provides متد را تعریف کنید. متد provides اتصالات کانتینر سرویس را که ارائه دهنده ثبت می کند برمی گرداند:

<?php namespace App\Providers;
 
use Riak\Connection;
use Illuminate\Support\ServiceProvider;
 
class RiakServiceProvider extends ServiceProvider {
 
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
 
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('Riak\Contracts\Connection', function($app)
{
return new Connection($app['config']['riak']);
});
}
 
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['Riak\Contracts\Connection'];
}
 
}

لاراول فهرستی از تمام خدمات ارائه شده توسط ارائه دهندگان خدمات معوق را همراه با نام کلاس ارائه دهنده خدمات خود گردآوری و ذخیره می کند. سپس، تنها زمانی که شما سعی می کنید یکی از این سرویس ها را حل کنید، لاراول ارائه دهنده سرویس را بارگیری می کند.