نسخه:

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

معرفی

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

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

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

همه ارائه دهندگان خدمات تعریف شده توسط کاربر در bootstrap/providers.php فایل ثبت شده اند. در مستندات زیر، یاد خواهید گرفت که چگونه ارائه دهندگان خدمات خود را بنویسید و آنها را در برنامه لاراول خود ثبت کنید.

اگر می‌خواهید درباره نحوه رسیدگی و عملکرد داخلی لاراول درخواست‌ها بیشتر بدانید، مستندات ما را در مورد چرخه عمر درخواست لاراول بررسی کنید .

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

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

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

php artisan make:provider RiakServiceProvider

روش ثبت نام

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

بیایید نگاهی به یک ارائه دهنده خدمات اولیه بیندازیم. در هر یک از روش‌های ارائه‌دهنده خدمات، شما همیشه به $app ویژگی دسترسی به ظرف سرویس دسترسی دارید:

<?php
 
namespace App\Providers;
 
use App\Services\Riak\Connection;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\ServiceProvider;
 
class RiakServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
$this->app->singleton(Connection::class, function (Application $app) {
return new Connection(config('riak'));
});
}
}

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

و خواص bindings singletons

اگر ارائه‌دهنده خدمات شما پیوندهای ساده زیادی را ثبت می‌کند، ممکن است بخواهید به جای ثبت دستی هر یک از کانتینرها، از ویژگی bindings و استفاده کنید. singletons هنگامی که ارائه‌دهنده خدمات توسط فریم‌ورک بارگذاری می‌شود، به‌طور خودکار این ویژگی‌ها را بررسی می‌کند و اتصالات آنها را ثبت می‌کند:

<?php
 
namespace App\Providers;
 
use App\Contracts\DowntimeNotifier;
use App\Contracts\ServerProvider;
use App\Services\DigitalOceanServerProvider;
use App\Services\PingdomDowntimeNotifier;
use App\Services\ServerToolsProvider;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
/**
* All of the container bindings that should be registered.
*
* @var array
*/
public $bindings = [
ServerProvider::class => DigitalOceanServerProvider::class,
];
 
/**
* All of the container singletons that should be registered.
*
* @var array
*/
public $singletons = [
DowntimeNotifier::class => PingdomDowntimeNotifier::class,
ServerProvider::class => ServerToolsProvider::class,
];
}

روش بوت

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

<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
 
class ComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
View::composer('view', function () {
// ...
});
}
}

تزریق وابستگی روش بوت

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

use Illuminate\Contracts\Routing\ResponseFactory;
 
/**
* Bootstrap any application services.
*/
public function boot(ResponseFactory $response): void
{
$response->macro('serialized', function (mixed $value) {
// ...
});
}

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

همه ارائه دهندگان خدمات در bootstrap/providers.php فایل پیکربندی ثبت شده اند. این فایل آرایه ای را برمی گرداند که حاوی نام کلاس های ارائه دهندگان خدمات برنامه شما است:

<?php
 
// This file is automatically generated by Laravel...
 
return [
App\Providers\AppServiceProvider::class,
];

وقتی دستور Artisan را فراخوانی می کنید make:provider ، لاراول به طور خودکار ارائه دهنده تولید شده را به bootstrap/providers.php فایل اضافه می کند. با این حال، اگر کلاس ارائه دهنده را به صورت دستی ایجاد کرده اید، باید کلاس ارائه دهنده را به صورت دستی به آرایه اضافه کنید:

<?php
 
// This file is automatically generated by Laravel...
 
return [
App\Providers\AppServiceProvider::class,
App\Providers\ComposerServiceProvider::class,
];

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

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

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

برای به تعویق انداختن بارگذاری یک ارائه دهنده، \Illuminate\Contracts\Support\DeferrableProvider رابط را پیاده سازی کنید و یک provides روش تعریف کنید. این provides روش باید اتصالات کانتینر سرویس ثبت شده توسط ارائه دهنده را برگرداند:

<?php
 
namespace App\Providers;
 
use App\Services\Riak\Connection;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\ServiceProvider;
 
class RiakServiceProvider extends ServiceProvider implements DeferrableProvider
{
/**
* Register any application services.
*/
public function register(): void
{
$this->app->singleton(Connection::class, function (Application $app) {
return new Connection($app['config']['riak']);
});
}
 
/**
* Get the services provided by the provider.
*
* @return array<int, string>
*/
public function provides(): array
{
return [Connection::class];
}
}