🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ پویا پارسایی
تزریق سرویس به کنترلر کار درستی است؟
جامعه لاراول ایجاد شده در ۲۴ خرداد ۱۴۰۱

سلام و عرض ادب

توی کنترلرمون به جای اینکه توی متدهای create و update دوتا ابجکت از سرویس VideoService بسازیم، اگر توی کانستراکتور کنترلر، کلاس سرویسمون رو تزریق کنیم و ازش توی متدهامون استفاده کنیم، کار درستیه؟

به این صورت:


namespace App\\Http\\Controllers;
use App\\Models\\Video;
use App\\Http\\Requests\\StoreVideoRequest;
use App\\Http\\Requests\\UpdateVideoRequest;
use App\\Services\\VideoService;
class VideoController extends Controller
{
    public function __construct(private VideoService $videoService)
    {
    }
    public function store(StoreVideoRequest $request)
    {
        $this->videoService->create($request->user(),$request->all());
        return redirect()->route('index')->with('success', __('messages.success'));
    }
    public function update(UpdateVideoRequest $request, Video $video)
    {
        $this->videoService->update($video,$request->all());
        return redirect()->route('videos.show', $video->slug);
    }
}

با این کار کلاس کنترلرمون به کلاس سرویسمون به اصطلاح couple نمیشه؟

best practice تو اینجور مواقع چیه؟

سلام

دقیقا Best Practice همین کار است که شما داخل Constructor سرویس مورد نظرتون رو Inject کنید. این موضوع به صورت کامل در پروژه‌ها توضیح داده شده.

موفق باشید.

مهرداد سامی ۲۴ خرداد ۱۴۰۱، ۱۵:۲۸

خیلی ممنون استاد بابت راهنماییتون، بله همین رو هم از ویدئوهای پروژه‌ها یاد گرفتم، فقط اینکه این موضوع باعث نمیشه کنترلر به سرویس به اصطلاح couple بشه؟ راه حل بهتری هم میتونه باشه که این مورد پیش نیاد؟


پویا پارسایی ۲۴ خرداد ۱۴۰۱، ۱۵:۳۳

اتفاقا این موضوع تا حد خیلی زیادی جلوگیری میکنه از Couple شدن کنترلر به سرویس، چون شما میتونید داخل Container لاراول سرویس VideoService رو تغییر بدید و به یک کلاس دیگه Bind بکنید.

زمانی که داخل متدها از کلاس new میگیرید و از اون استفاده میکنید ۲ تا اتفاق میوفته:

۱- اصطلاحا به این کار میگن Hidden Dependency، چون کسی که بیاد کلاس شما رو ببینه باید حتما متدها رو بخونه تا متوجه بشه که کلاس شما به چه کلاس دیگه‌ای Dependency داره ولی اگه داخل Constructor باشه هر شخص دیگه‌ای کلاس رو باز کنه متوجه میشه که کلاس شما به چه کلاسی Dependency داره.

۲ - زمانیکه شما بخواید کلاس VideoService رو عوض کنید باید حتما برید داخل کلاس‌هایی که از این کلاس استفاده کردن و اونها رو تغییر بدید ولی با استفاده از Dependency Injection داخل Constructor میتونید فقط نیاز هستش که داخل Container کلاس جدیدتون رو معرفی کنید.

بهترین پاسخ
مهرداد سامی ۲۴ خرداد ۱۴۰۱، ۱۵:۴۰