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