مفاهیم معماری در لاراول – پرووایدرهای سرویس

مفاهیم معماری در لاراول - پرووایدرهای سرویس

ما در این مقاله از مستندات لاراول 10 در مورد “پرووایدرها” صحبت خواهیم کرد.

پرووایدرها  در لاراول 10 چه کاری انجام میده؟
در فریم‌ورک لاراول، providers یکی از مفاهیم اصلی هستند که برای بارگذاری و راه‌اندازی سرویس‌ها و قابلیت‌های اضافی در برنامه‌های لاراول استفاده می‌شود.
یک provider می‌تواند کلاسی باشد که متدهایی را در اختیار برنامه‌نویس قرار می‌دهد تا بتواند امکاناتی را به برنامه اضافه کند. برای نمونه، می‌توان یک provider برای اتصال به پایگاه داده ایجاد کرد و متدهایی را در اختیار قرار داد که برنامه‌نویسان بتوانند به راحتی با پایگاه داده ارتباط برقرار کنند.
در واقع، providers در لاراول به برنامه‌نویسان کمک می‌کنند تا کد خود را به قسمت‌های کوچکتر و قابل استفاده‌تر تقسیم کنند و باعث می‌شوند که ساختار کدهای لاراول بهتر و مرتب‌تر شود.

برای استفاده از پرووایدرها، شما باید آنها را در برنامهٔ خود ثبت کنید و سپس از سرویس‌ها و تنظیماتی که توسط آنها فراهم می‌شوند، استفاده کنید. در این صفحه، نحوهٔ ثبت پرووایدرها، استفاده از سرویس‌ها، دسترسی به تنظیمات پرووایدرها و دیگر مفاهیم مرتبط توضیح داده شده است.

با مطالعهٔ این صفحه، شما می‌توانید درک بهتری از نقش و کاربرد پرووایدرها در لاراول 10 پیدا کنید و از آنها بهره‌برداری کنید.

# مقدمه (Introduction)

سرویس پرووایدرها، مکان مرکزی برای تنظیم و آماده‌سازی ابزارهای لاراول هستند. برنامهٔ شما و همچنین تمامی سرویس‌های اصلی لاراول از طریق سرویس پرووایدرها آماده می‌شوند.

به طور کلی، ما منظورمان ثبت چیزها است، از جمله ثبت مواردی مانند تنظیمات کانتینر سرویس، گوش کنندگان رویداد، میان‌افزارها و حتی مسیرها. پرووایدرها مکان مرکزی برای پیکربندی برنامهٔ شما هستند.

اگر فایل config/app.php را در لاراول باز کنید، آرایهٔ providers را خواهید دید. این همه کلاس‌های پرووایدر سرویسی هستند که برای برنامهٔ شما بارگذاری خواهند شد. به طور پیش‌فرض، مجموعه‌ای از پرووایدرهای سرویس اصلی لاراول در این آرایه لیست شده‌اند. این پرووایدرها مولفه‌های اصلی لاراول را شروع کرده و آماده می‌کنند، مانند میلر، صف، حافظه نهان و دیگر اجزا. بسیاری از این پرووایدرها پرووایدرهای “به تعویق افتاده” هستند، به این معنی که در هر درخواستی بارگذاری نمی‌شوند، بلکه فقط زمانی که خدماتی که ارائه می‌دهند واقعاً نیاز است بارگذاری می‌شوند.

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

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

# نوشتن پرووایدرهای سرویس (Writing Service Providers)

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

CLI Artisan می‌تواند یک ارائه‌دهنده جدید را با استفاده از دستور make:provider ایجاد کند.

php artisan make:provider RiakServiceProvider

# متد رجیستر (The Register Method)

در روش 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` در کانتینر سرویس استفاده می‌کند.

The bindings And singletons Properties

اگر شما در ارائه‌دهنده‌ی سرویس‌های خود، می‌خواهید بسیاری از اتصالات ساده را ثبت کنید، می‌توانید به جای ثبت دستی هر اتصال کانتینر، از ویژگی‌های 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,
    ];
}

# متد بوت (The Boot Method)

پس اگر ما نیاز داشته باشیم یک 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 Method Dependency Injection
شما می‌توانید وابستگی‌ها را برای روش boot ارائه‌دهنده‌ی سرویس خود تایپ کنید. کانتینر سرویس به طور خودکار هر گونه وابستگی مورد نیاز شما را تزریق می‌کند. به عبارت دیگر، شما می‌توانید به کانتینر سرویس بگویید که چه وابستگی‌هایی برای روش boot شما نیاز است و سپس کانتینر سرویس هر وابستگی مورد نیاز را به طور خودکار برای شما تزریق می‌کند.

# ثبت پرووایدرها (Registering Providers)

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

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

'providers' => ServiceProvider::defaultProviders()->merge([
    // Other Service Providers
 
    App\Providers\ComposerServiceProvider::class,
])->toArray(),

# پرووایدرهای به تعویق افتاده (Deferred Providers)

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

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

برای به تأخیر انداختن بارگذاری یک ارائه دهنده، یک رابط باید \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];
    }
}

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *