IoC Container

  • مقدمه
  • کاربرد اولیه
  • اختصاص دادن خودکار کلاس
  • کاربرد عملی
  • ارائه دهندگان خدمات
  • کانتینر رویدادها

مقدمه

کانتینر کنترل معکوس inversion of control یا( IoC ) در لاراول، یک ابزار قدرتمند برای مدیریت وابستگی کلاس هاست. Dependency injection یک متد حذف وابستگی های کلاسهایی با کدگذاری سخت، است. به جای آن، وابستگی ها در زمان اجرا (run-time) اعمال می گردند تا انعطاف پذیری بیشتر برای پیاده سازی وابستگی ها و تغییر آنها داشته باشند.

درک مفهوم IoC container لاراول بسیار ضروری است، بخصوص برای ساخت یک اپلیکیشن بزرگ و قدرتمند و نیز برای ارائه کمک به هسته لاراول مهم است.

کاربرد اولیه

دو راه برای رفع وابستگی ها توسط IoC container وجود دارد: با Closure callbackها یا تحلیل خودکا (automatic resolution). ابتدا ما Closure callback را بررسی می­کنیم. اول، یک”نوع”  (type) به container نسبت می دهیم.

نحوه نسبت دادن یک نوع به Container

 

 

 

 

اختصاص دادن یک نوع به Container

;(‘$value = App::make(‘foo

 

زمانی که متد App::make فراخوانی می گردد، یک Closure callback اجرا شده و نتیجه برگردانده می شود.

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

نسبت دادن نوع “Shared” به Container

 

 

 

شما همچنین می توانید یک نمونه شی موجود را با استفاده از متد instance به کانتینر نسبت دهید.

نسبت دادن یک نمونه موجود به Container

 

;$foo = new Foo

(App::instance (‘foo’, $foo

اختصاص دادن خودکار کلاس

IoC container  به اندازه کافی برای اختصاص دادن کلاس ها بدون هرگونه تنظیماتی در تمامی سناریوها قدرتمند است. به عنوان مثال:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

نحوه اختصاص دادن یک کلاس

توجه داشته باشید که با وجود اینکه ما کلاس FooBar را در کانتینر ثبت نکرده ایم، هنوز قابلیت اختصاص دادن کلاس را دارا می باشد، حتی اعمال وابستگی های Baz به صورت خودکار اعمال می گردد.

زمانی که یک نوع به کانتینر نسبت داده می شود، از امکانات Reflection پی اچ پی استفاده می کند تا کلاس را بازرسی کرده و type-hintهای سازنده را بخواند. با استفاده از این اطلاعات، کانتینر به صورت خودکار یک نمونه از کلاس ایجاد می کند.

اگرچه، در برخی موارد، یک کلاس ممکن است به جای یک “نوع واقعی (concrete type)” به پیاده سازی رابط کاربری (Interface) وابسته باشد. در مواجهه با این مورد، بایستی متد   App::bind  به جهت آگاه ساختن کانتینر از این مطلب که کدام پیاده سازی رابط کاربری باید اعمال شود، استفاده گردد.

 

نسبت دادن یک رابط کاربری به یک پیاده سازی

;(‘App::bind(‘UserRepositoryInterface’, ‘DbUserRepository

حال کنترلر زیر را در نظر بگیرید:

 

 

 

 

 

 

 

از آنجاییکه ما UserRepositoryInterface را به یک نوع واقعی نسبت داده ایم، DbUserRepository  به صورت خودکار در زمان ایجاد کنترلر به آن اعمال می گردد.

 

کاربرد عملی

لاراول فرصتهای بسیاری برای استفاده از IoC container به جهت افزایش انعطاف پذیری و قابلیت آزمایش برنامه را  فراهم می کند. یک مثال ابتدایی در زمان اختصاص دادن کنترلر است. تمامی کنترلرها از طریق IoC container اختصاص داده می شوند، بدین معنی که شما می توانید به نوع وابستگی های یک کنترلر در سازنده آن اشاره کنید و آنها به صورت خودکار اعمال می گردند.

تایپ کردن و پیشنهاد دادن مثال هایی (type hint) برای وابستگی های کنترلر

 

 

 

 

 

 

 

 

 

 

در این مثال، کلاس OrderRepository به صورت خودکار در کنترلر اعمال می گردد. این بدین معنی است که در هنگام تست واحد (unit testing) نمودن یک “mock”، OrderRepository ممکن است به کانتینر نسبت داده شده و به کنترلر اعمال می گردد تا شرایط آسان تحلیل تعامل لایه پایگاه داده را مهیا کند.

فیلترها، کامپوزرها و مدیران رویدادها (event handler) نیز می توانند خارج از IoC container تحلیل گردند، در هنگام ثبت آنها، به راحتی تنها کافی است نام کلاسی که باید استفاده شود را به آن بدهید.

مثال های دیگری از کاربرد IoC

 

 

 

 

 

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

ارائه دهندگان خدمات روشی مناسب برای گروه بندی ثبت نام های IoC مرتبط؛ در یک مکان است. آنها را به عنوان راهی برای راه اندازی خودکار کامپوننت ها در برنامه فرض کنید. درون یک ارائه دهنده خدمات، می توانید یک درایور احراز هویت سفارشی شده ثبت کنید و کلاس های انبار برنامه با IoC container را نیز ثبت کرده یا یک دستور Artisan سفارشی را اجرا کنید.

در واقع، اکثر کامپوننت های هسته لاراول شامل ارائه کنندگان خدمات هستند. تمامی ارائه دهندگان خدمات برنامه در یک آرایه providers در فایل پیکربندی app/config/app.php قرار دارند.

برای ایجاد یک ارائه دهنده خدمات، به سادگی کافی است کلاس Illuminate\Support\ ServiceProvider  را توسعه داده و یک متد Illuminate\Support\ServiceProvider  تعریف کنید.

نحوه تعریف یک ارائه دهنده خدمات

 

 

 

 

 

 

 

 

 

توجه داشته باشید که، در متد register، IoC container  برنامه از طریق خاصیت $this->app در دسترس است. زمانی که یک ارائه دهنده ایجاد می شود و آماده ی ثبت کردن آن در برنامه  است ، به سادگی آن را به آرایه providers در فایل پیکربندی app اضافه می کنیم.

ممکن است یک ارائه دهنده خدمات را در زمان اجرا با متد App::register ثبت کنید.

نحوه ثبت کردن یک ارائه دهنده خدمات در زمان اجرا

;(‘App::register(‘FooServiceProvider

کانتینر رویدادها

فایل های Container در هر اختصاص دادن شیء؛ یک رویداد ایجاد می کند. می توانید با متد resolving  این واقعه را ببینید

نحوه ثبت یک گوش دهنده رویداد

 

 

 

 

 

 

 

اسکرول به بالا