رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Service Provider
#1
سلام خدمت همه دوستان
بنده چن روزی میشه شروع به یادگیری لاراول کردم. و یه چنتا سوال از خدمتتون داشتم.
1.Service provider چی هست و کجاها باید ازش استفاده کنیم البته میدونم تو ساخت package خیلی استفاده میشه ولی در مورد استفاده معمولیش چیزه زیادی از سایتش نفهمیدم.
اگه میشه خیلی ساده و روان و در صورت امکان همراه با مثال توضیح بدین!
بازم ممنون
پاسخ
#2
(06-29-2015, 05:41 AM)rizsoft نوشته:  سلام خدمت همه دوستان
بنده چن روزی میشه شروع به یادگیری لاراول کردم. و یه چنتا سوال از خدمتتون داشتم.
1.Service provider چی هست و کجاها باید ازش استفاده کنیم البته میدونم تو ساخت package خیلی استفاده میشه ولی در مورد استفاده معمولیش چیزه زیادی از سایتش نفهمیدم.
اگه میشه خیلی ساده و روان و در صورت امکان همراه با مثال توضیح بدین!
بازم ممنون

Service Provider تقریبا جز مباحث متوسط تا پیشرفته محسوب میشه. برای اینکه بتونید Service Providerها رو درک کنید، باید مفاهیمی مثل IoC Container بدونید. به همین خاطر اول توضیح خیلی کوچیکی در مورد IoC میدم بعد در ادامه خود Service Provider رو توضیح میدم.

IoC Container در واقع یک آرایه کلید مقدار (key-value array) هست، کلید‌های این آرایه معمولا نام مستعار کلاس (Class Alias) یا آدرس یک اینترفیس هستن. با استفاده از این کلیدها شما می‌تونید مستقیما به کلاس متناظر اون کلید دسترسی پیدا کنید. اصطلاحا اون کلید با کلاس متناظرش Bind شده.

یکی از جاهایی که از IoC Container زیاد استفاده می‌شه، موقع Dependency Injection هست. فرض کنید کنترلی به این صورت دارید:

کد پی‌اچ‌پی:
<?php

class FooController {

 protected 
$bar;

 public function 
__construct(BarInterface $bar)
 {
 
$this->bar $bar;
 }

 
//...



نمونه کد بالا می‌تونه مثال خیلی ساده ای از Dependency Injection باشه.
وقتی لاراول میاد که از کنترل شما نمونه سازی کنه تا بتونه متد‌هاش رو اجرا کنه، اول میاد متد construct رو چک می‌کنه و میبینی که کنترلر به چه کلاس‌های دیگه‌ای نیاز داره و میاد از کلاس‌های مورد نیاز نمونه سازی می‌کنه. که توی مثال بالا کنترلمون به BarInterface نیاز داره، همونطور که می‌دونید اینترفیس‌ها قابل نمونه سازی نیستن. وقتی میبینه کلاس مورد نیاز یک اینترفیس هست، میره داخل IoC Container و به دنبال کلاسی که به این اینترفیس bind شده می‌گرده و از اون کلاس نمونه سازی می‌کنه و در متد construct قرار میده.

حالا برمی‌گردیم به Service Provider
یکی از اصلی‌ترین اهداف Service Providerها bind کردن کلاس‌ها با اینترفیس یا نام مستعارشونه که در متد rgister این کار به شکل زیر انجام میشه:

کد پی‌اچ‌پی:
<?php

use Illuminate\Support\ServiceProvider;

class 
AppServiceProvider extend ServiceProvider {

 
   /**
     * Bootstrap the application services.
     *
     * @return void
     */
 
   public function boot()
 
   {
 
       //
 
   }

 
   /**
     * Register the application services.
     *
     * @return void
     */
 
   public function register()
 
   {
 
       $this->application->bind('BarInterface''Bar');
 
   }



البته داخل Service Providerها کارهای زیادی میشه کرد. نمونه‌ی دیگه ای که می‌تونم نام ببرم ثبت کردن View Composerها هست که در متد boot صورت می‌گیره.

به طور خلاصه مجموعه ای از تعریف‌ها که باید هنگام بوت شدن برنامه انجام بشن، در Service Provider قرار میگیرن.

هنگام بوت شدن برنامه لاراول فایل app.php که تو پوشه config قرار داره رو میخونه و لیست Service Providerها رو از قسمت providers این فایل میخونه و به ترتیب اونارو اجرا میکنه.

همونطور که خودتون هم اشاره کردین Service Providerها بیشتر برای پکیج‌ها استفاده می‌شن و داخلش فایل‌های کانفیگ، فایل‌های زبان، Viewها و امثال این رو به لاراول معرفی می‌کنن.

امیدوارم مفید بوده باشه، اگر سوال داشتید درخدمتم
Senior PHP & Laravel Developer | Software Architecture

[عکس: __Twitter.png]       [عکس: __Linkedin.png]

weblog | Codecasts
پاسخ
#3
احسنتوم الله بر شما دلاور
فقط یه نکته.
من یه برنامه واقعا بزرگ دارم باهاش مینویسم نظرم اینه تا اولشم به صورت استاندارد پیش برم که در آینده دوباره کاری نشه بیام تغییر  ساختار بدم.
آیا واقعا جایی لازمه از پرووایدرا استفاده کنم. که استاندارد باشه
و ی چیز دیگه اینکه بعضی کارا هست که لاراول بیخودی از بانک سلکت میکنه یه نمونش Auth::user من میخوام اینو داخل سشن ذخیره کنم. آیا کاره درستیه یا همینجوری کار کنم
بازم ممنون
پاسخ
#4
(06-29-2015, 06:02 PM)rizsoft نوشته:  احسنتوم الله بر شما دلاور
فقط یه نکته.
من یه برنامه واقعا بزرگ دارم باهاش مینویسم نظرم اینه تا اولشم به صورت استاندارد پیش برم که در آینده دوباره کاری نشه بیام تغییر  ساختار بدم.
آیا واقعا جایی لازمه از پرووایدرا استفاده کنم. که استاندارد باشه

اگه بخواین استاندارد جلو برین بهتره که کلاس‌هاتون اینترفیس داشته باشن و اینترفیس رو به کلاس‌هاتون اینجکت کنید (مثل مثالی که زدم) یا اینکه با اینترفیس پارمتر‌های متدهای کلاس‌هاتون رو Type Hint کنید. و برای این کار نیاز دارید که داخل یه کلاس Service Provider اینترفیس‌ها رو با پیاده‌سازی‌هاش bind کنید.

به عنوان ریفرنس می‌تونید مثال‌هایی که با خود لاراول هستن رو یه نگاه بندازید. مثل https://github.com/laravel/laravel/blob/5.0/app/Providers/AppServiceProvider.php


(06-29-2015, 06:02 PM)rizsoft نوشته:  و ی چیز دیگه اینکه بعضی کارا هست که لاراول بیخودی از بانک سلکت میکنه یه نمونش Auth::user من میخوام اینو داخل سشن ذخیره کنم. آیا کاره درستیه یا همینجوری کار کنم
بازم ممنون

در کل مشکلی نداره این کوئری‌ها ولی اگه دوست دارید تغییری توش بدید بهتره که کلاسی که می‌خواید رفتارش رو تغییر بدید رو extend کنید، تغییرات لازم رو انجام بدید و از کلاس اکستند شده به جای اون کلاس استفاده کنید. فقط دقت کنید بعضی از کلاس‌های لاراول داخل هسته خود فریم‌ورک (سرویس پرووایدر های خود فریم‌ورک) رجیستر شدن و اگه اون‌ها رو تغییر بدید باید دوباره با یه Service Provider اونارو دوباره رجیستر کنید.
Senior PHP & Laravel Developer | Software Architecture

[عکس: __Twitter.png]       [عکس: __Linkedin.png]

weblog | Codecasts
پاسخ
#5
Heart ممنون
پاسخ
 


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  نحوه ساخت service provider در لاراول 5 atazadeh 1 380 05-31-2015, 04:13 PM
آخرین ارسال: alihossein

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

درباره انجمن فریم ورک لاراول

انجمن لاراولیستا به عشق توسعه دهنده ها و علاقمندان به این فریم ورک محبوب ایجاد شده و امیدواریم با نظرات خوبتون ما رو در بهبود کار یاری کنید. در ضمن خیلی هم خوشحال میشیم شما هم در توسعه این انجمن سهمی داشته باشید.