امروز بحث رو اندکی تخصصی تر میکنیم و میریم سمت container قدرتمند لاراول. یکی از مشخصه هایی که لاراول رو از سایر فریمورک های PHP جدا میکنه ، همین IOC هست. Dependency injection یا DI یا تزریق نیازمندیها یک موضوع مهم در همه زبانهای شئ گراست. اینکه شما سایر کلاسها رو در کلاس خودتون استفاده کنید خیلی مهمه.
اما IOC کانتینر چیست؟
برای اینکه از یک کلاس در کدمون استفاده کنیم باید از اون نمونه بگیریم. یه چیزی مثل کد زیر :
$myInstance = new MyClass();
$myInstance->method();
حتما بارها شده که مقدار Request $request
رو بعنوان ورودی به یک تابع در کنترلر میفرستید. سوالی که پیش میاد اینه که بدون نمونه گرفتن از کلاس Request چطور PHP اونو میشناسه؟ اینجاست که کاربرد IOC مشخص میشه. لاراول با کانتینرش شرایطی رو مهیا کرده که شما به راحتی با آبجکت ها کار کنید و ازشون نمونه بگیرید. لاراول وقتی کدی مثل FOO $foo رو میبینه دنبال کلاس FOO میگرده که از اون نمونه بگیره به شرطی که کلاس FOO به کانتینر معرفی شده باشه قبلا. این خیلی خوبه. شما بدون اینکه از کلاس نمونه بگیرید نمونه گرفته میشه. بعضی وقتا پیش میاد که شما میخواید یک ریپازیتوری بنویسید که دیگران هم بتونن ازش استفاده کنن. اینجا نیاز هست که کلاس خودتون رو به لاراول برای نمونه گیری معرفی کنید و شما باید بصورت دستی کلاس رو به IOC بچسبونید یا به اصطلاح bind کنید.
نحوه ی bind یک کلاس به IOC در لاراول
ساده ترین روش بایند کردن کلاس به ioc استفاده از فساد App هست که باهاش میتونید هر جایی در برنامه یه کلاس رو به کانتینر بایند کنید. (هر چند بهترین جا برای بایند کردن استفاده از service provider ها هست)
App::bind('Hamid\Repositories\User\UserRepository', function($app)
{
return new EloquentUserRepository( new User );
});
در کد بالا EloquentUserRepository
رو چسبوندیم به کانتینر و از این به بعد لاراول کلاس EloquentUserRepository
رو میشناسه همه جا و resolve
اش میکنه.
حتما در مورد فساد ها در لاراول اطلاعاتی دارید. همه ی کلاسهایی که در فساد ها ازشون استفاده میکنیم قبلا به کانتینر بایند شدن. مثلا در زیر بخشی فایل Illuminate/Support/Facades/Auth.php
رو میبینید که مربوط به فساد Auth هست که هر روز ازش استفاده میکنیم:
class Auth extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'auth';
}
همونطور که میبینید متد استاتیک getFacadeAccessor
داره یه رشته رو برمیگردونه که در فایل Illuminate/Auth/AuthServiceProvider.php
بصورت زیر به کانتینر بایند شده:
$this->app->singleton('auth', function ($app) {
return new AuthManager($app);
});
سلام. ممنون از مطلب خوبتون. بارها از IoC استفاده کردین که به نظرم بهتر هستش بگین که مخفف چی هستش
سلام ُ مرسی . inversion of control 🙂
و باز هم سلام. یه مورد دیگه اینکه بهتره بگین که چند نوع DI داریم که اینی که الان داریم استفاده می کنیم بهش میگن type-hint که می تونه به صورت constructor DI باشه یا به صورت setter DI
ممنون از مطلب خوبتون
شما فرمودید دیگههه . خیلی مرسی بابت نظر مفیدتون
ممنون از مطالب خوبتون
خیلی از مشکلاتم رو در فهم لاراول حل میکنن