ارائه دهندگان خدمات
معرفی
ارائه دهندگان خدمات مرکز اصلی بوت استرپینگ برنامه های لاراول هستند. برنامه شخصی شما و همچنین تمام خدمات اصلی لاراول از طریق ارائه دهندگان خدمات بوت استرپ می شوند.
اما، منظور ما از "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]; }}