آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

آموزش Service Providers در لاراول

دوره های مرتبط با این مقاله

Service Providers در لاراول

  1. مقدمه
  2. نوشتن Service Providers اختصاصی
    • متد Register
    • متد Boot
  3. ثبت Provider ها
  4. Deferred Providers (به تعوق انداختن بارگذاری provider)

مقدمه

Service provider ها جایی هستند که فرایند bootstrapping (تنظیم و راه اندازی اولیه) اپلیکیشن عملا در آن انجام می گیرد. نه تنها برنامه ی کاربردی بلکه تمامی سرویس های هسته ی Laravel از طریق service provider ها تنظیم و راه اندازی اولیه می شوند.
ابتدا به شرح منظور خود از اصطلاح bootstrapping می پردازیم. به طور کلی منظور از bootstrapping، ثبت و رجیستر binding های service container (متصل کردن کلاس ها به container ها)، event listener، middleware و حتی route ها است. می توان به Service providers به چشم یک مکان واحد برای پیکربندی اپلیکیشن تحت وب نگاه کرد.
اگر فایلconfig/app.php را که پیش فرض همراه با چارچوب نرم افزاری لاراول عرضه می شود باز نمایید، در آن صورت یک آرایه به نامproviders را مشاهده می کنید. آنچه در این آرایه مشاهده می شود در واقع تمامی کلاس های Service provider ای است که برای برنامه ی شما بارگذاری می گردد. گفتنی است که اغلب کلاس های نام برده provider های از نوع "deferred " هستند. این نوع provider ها تنها زمای لود می شوند که سرویس های ارائه شده توسط آن ها واقعا مورد نیاز باشند. بنابراین با هر درخواستی بارگذاری نمی شوند.
در این مرور کلی با نحوه ی نوشتن service provider های اختصاصی خود و ثبت آن در اپلیکیشن لاراول آشنا می شویم.

نوشتن Service Provider های اختصاصی

تمامی service provider ها از کلاس Illuminate\Support\ServiceProvider ارث بری می کنند. این کلاس انتزاعی (abstract) شما را ایجاب می کند حداقل یک متد به نام register در provider خود تعریف نمایید. داخل متد مزبور می بایست کلاس ها را تنها به Service Container متصل (bind) کنید. توجه داشته باشید که به هیچ وجه نباید event listener ها، route ها یا هر قابلیت دیگری را در متد registerثبت کنید.
به منظور ایجاد یک provider جدید، کافی است دستور make:provider را اجرا کنید:

                    php artisan make:provider RiakServiceProvider

متد Register

همان طور که در بالا ذکر شد، داخل متد register فقط اجازه ی متصل کردن کلاس ها در service container را دارید. تحت هیچ شرایطی نبایدevent listener ها، route ها یا هر قابلیت دیگری را داخل متد register ثبت کنید، در غیر این صورت ممکن است به صورت تصادفی از سرویسی استفاده کنید که هنوز کامل بارگذاری نشده است.
حال توجه خود را به یک service provider ساده جلب می کنیم:

<?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(config('riak'));
       });
   }
}

این service provider تنها یک متد register تعریف می کند و سپس از آن متد برای تعریف یک پیاده سازی از کلاسRiak\Contracts\Connection در service container بهره می گیرد.

متد Boot

حال اگر لازم شود یک view composer داخل service provider خود ثبت کنیم چه کاری را باید انجام دهیم؟ این کار را می توان با بکار گیری متدboot ترتیب داد. متد مذکور زمانی صدا خورده می شود که تمامی دیگر service provider ها کاملا ثبت شده باشند. بنابراین شما به تمامی دیگر سرویس هایی که توسط فریم ورک ثبت و ارائه شده دسترسی خواهید داشت:

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

متد Boot و Dependency injection

می توانیم dependency ها را درون متد boot اعلان نوع (type-hint) کنیم. service container خود به صورت اتوماتیک تمامیdependency های مورد نیاز شما را تزریق خواهد کرد:

use Illuminate\Contracts\Routing\ResponseFactory;
public function boot(ResponseFactory $factory)
{
   $factory->macro('caps', function ($value) {
       //
  });
}

ثبت و معرفی Provider ها

کلیه ی service provider ها در فایل پیکربندی config/app.php ثبت می شوند. فایل مذکور دربردارنده ی آرایه ی providers می باشد که در آن می توانید اسم service provider های خود را لیست کنید. به طور پیش فرض، مجموعه ای از service provider های هسته ی laravel در این آرایه مشخص می شوند. این provider ها نیز کامپوننت های هسته ی لاراول نظیر mailer، queue، cache و غیره .. را تنظیم و راه اندازی اولیه می کنند.
به منظور ثبت provider مورد نظر خود، کافی است آن را به آرایه اضافه کنید:

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

Deferred Provider ها (به تعویق انداختن بارگذاری provider)

چنانچه provider شما فقط و فقط binding ها را در service container ثبت کرده، در آن صورت بهتر است ثبت آن provider را تا زمانی که حداقل یکی از binding های به ثبت رسیده واقعا لازم شوند، به تاخیر بیندازید. با به تاخیر انداختن بارگذاری چنین provider ای، کارایی برنامه به طور قابل توجهی بهبود می یابد. علت افزایش کارایی برنامه این است که در روش نام برده، دیگر provider به ازای هر درخواست ورودی به اپلیکیشن از filesystem بارگذاری نمی شوند.
جهت به تاخیر انداختن بارگذاری provider مورد نظر، بایستی پراپرتی defer را با true مقداردهی کرده و سپس یک متد provides تعریف نمایید. متد ذکر شده binding هایی را که provider ثبت می کند، به عنوان خروجی بازمی گرداند:

<?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'];
   }
}

لاراول لیستی از تمامی سرویس هایی که deferred service provider ها ارائه می کنند را به همراه اسم کلاس service provider مربوطه ی آن کامپایل و ذخیره می کند. حال لاراول تنها زمانی service provider را لود می کند که شما بخواهید یکی از این سرویس ها را بکار ببرید.

  • 910
  •    276
  • تاریخ ارسال :   1395/02/22

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .