💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ MohammadMoghadasi
سوال در مورد داکیومنت 3
مهرداد سامی حل شده توسط مهرداد سامی

سلام خدمت استاد

However, since the repository is injected, we are able to easily swap it out with another implementation. We are also able to easily "mock", or create a dummy implementation of the UserRepositorywhen testing our application. منظور از این متن چیه دقیقا؟ ...

There is no need to bind classes into the container if they do not depend on any interfaces. The container does not need to be instructed on how to build these objects, since it can automatically resolve these objects using reflection. منظور از این متن چیه ؟...

استاد یک توضیح راجب کلا service container میدید ؟ و اینکه چرا ازش اصلا استفاده می‌کنند؟

 

 

سلام ...

 این متن‌ها همشون در مورد Service Container هستش ... 

ببینید Service Container درمجموع ۲ وظیفه اصلی داره ... ساخت آبجکت ... Dependency Injection ( تزریق وابستگی‌ها ) .... 

یک قانون وجود داره داخل شی گرایی که شما به هیچ عنوان نباید تا جایی که میتونید از کلمه new استفاده کنید ... یعنی به صورت دستی خودتون نباید یک آبجکت بسازید ... دلایل خیلی زیادی داره که اگه میخواید این دلایل رو کامل متوجه بشید و بخونید راجع بهش اصل پنجم SOLID یعنی Dependency Inversion رو بخونید ... به صورت کامل ... 

این لینک رو هم بخونید ... 

حالا زمانی که ما نباید از کلمه new استفاده کنید باید یه سرویس این وسط داشته باشیم که بهش بگیم ما یک آبجکت میخوایم و اون آبجکت رو به ما تحویل بده ... این کار service container هستش ... داخل لاراول شما با استفاده از متد resolve میتونید درخواست یک آبجکت رو از Container لاراول بکنید ... 

با استفاده از Container شما قابلیت‌های زیادی دارید مثلا فرض کنید شما ۲ نوع دیتابیس داخل سیستم دارید .. یکی Mysql و یکی دیگه MongoDB . و هردوی اون‌ها هم قرارداد Database رو پیاده سازی کردن .....حالا فرض کنید که کلاس یوزر میخواد همه یوزرها رو از دیتابیس دریافت کنه .. کلاس یوزر نباید اطلاع داشته باشه که داره از MongoDB میگیره یا از Mysql ... کلاس یوزر فقط باید مطلع باشه که یک متد all وجود داره که با استفاده از اون میتونه کل یوزرها رو بگیره ... پس در نتیجه ما داخل کلاس یوزر Database رو inject میکنیم ... بعد داخل container میگیم که هروقت گفتیم Database کلاس MongoDB رو برگردون ... به همین راحتی .. خیلی راحت هم میتونیم دیتابیس رو عوض کنیم بدون اینکه کلاس user متوجه این موضوع بشه ... ... یعنی اصطلاحا میتونید bind کنید .. که داخل لاراول شما انواع مختلفی از binding رو دارید ... از این لینک میتونید همش رو مطالعه کنید .. 

interface Database
{
  public function allUsers();
}
class MongoDB implements Database
{
  public function allUsers()
  {
    echo "return all users form mongodb"
  }
}
class Mysql implements Database
{
  public function allUsers()
  {
    echo "return all users form mysql"
  }
}
class User
{
   public function getAllUsers(Database $database)
   {
      return $database->allUsers();
   }
}
//AppServiceProvider.php
$this->app->bind(
    Database::class,
    MongoDB::class
);

وظیفه دیگه ای که داره Dependecy Injection هستش .. شما میتونید داخل یک کلاس به عنوان یک پارامتر ورودی یک نوع از یک کلاس رو درخواست کنید و container لاراول به شما اون رو تحویل میده ... کاری که ما داخل کلاس User کردیم ... 

این کارها رو ما دقیقا داخل پروژه سیستم پرداخت انجام دادیم که سبد خرید رو متصل کردیم به SessionStorage ... داخل AppServiceProvider انجام دادیم ... 

Container‌های خیلی زیادی وجود داره که فریمورک‌های مختلف برای خودشون نوشتن و دارن ازش استفاده میکنن ... 

بحث Container مباحث زیادی داره ... که خوبه راجع بهش سرچ کنید و از اون استفاده کنید ... 

متن اول شما هم دقیقا به همین مورد اشاره میکنه که شما میتونید یک service رو inject کنید داخل مثلا کنترلر و از اون استفاده کنید .. مثال بالا دقیقا این مورد رو توضیح میده ...  ... یعنی مبحث depdency injection 

در مورد متن دومتون هم مثلا فرض کنید که ما فقط یک کلاس Mysql داریم و نه Mongodb وجود داره و نه Database ... توی این حالت ما داخل کلاس یوزر به جای اینکه بگیم Database میگیم کلاس Mysql رو Inject کن ... ولی دیگه نیازی نیست که بریم و داخل AppserviceProvider کلاس Mysql رو bind بکنیم ... چون زمانی که فقط یک پیاده سازی از اون وجود داره خود لاراول متوجه میشه که چه کلاسی رو باید برگردونه .... 

 

 

 

بهترین پاسخ
مهرداد سامی ۱۰ شهریور ۱۳۹۸، ۰۹:۵۱