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

سلام و عرض ادب

متد کانستراکتور کلاس MagicAuthentication  یه آرگومان داره که request$ هست:


namespace App\\Services\\Auth;
use App\\Models\\LoginToken;
use App\\Models\\User;
use Illuminate\\Http\\Request;
use Illuminate\\Support\\Facades\\Auth;
class MagicAuthentication
{
    public const INVALID_TOKEN = 'token.invalid';
    public const AUTHENTICATED = 'authenticated';
    public function __construct(private Request $request)
    {
    }
    public function requestLink()
    {
        $user = $this->getUser();
        $user->createMagicLoginToken()->send([
            'remember' => $this->request->has('remember')
        ]);
    }
    private function getUser()
    {
        return User::where('email',$this->request->email)->firstOrFail();
    }
    public function authenticate(LoginToken $token)
    {
        $token->delete();
        if($token->isExpired()){
            return self::INVALID_TOKEN;
        }
        Auth::login($token->user,$this->request->query('remember'));
        return self::AUTHENTICATED;
    }
}

توی متدهای این کلاس هم از اون request$ استفاده کردیم.

ولی توی کانتسراکتور کنترلر MagicController وقتی که از کلاس MagicAuthentication آبجکت ساختیم، هیچ پارامتری بهش پاس ندادیم:


namespace App\\Http\\Controllers;
use App\\Models\\LoginToken;
use App\\Services\\Auth\\MagicAuthentication;
use Illuminate\\Http\\Request;
class MagicController extends Controller
{
    public function __construct(private MagicAuthentication $auth)
    {
    }
    public function login(LoginToken $token)
    {
        return $this->auth->authenticate($token) === $this->auth::AUTHENTICATED
            ? redirect()->route('home') :
            redirect()->route('auth.magic.login.form')->with('failed', 'auth.magic link failed to send');
    }
}

با این وجود کلاس MagicAuthentication داره به درستی کار میکنه.

چرا و چطور بدون اینکه پارامتر request$ رو بهش پاس بدیم، داره از این پراپرتی استفاده میکنه؟

سلام پویا عزیز، وقت به خیر

این مورد توسط service container لاراول هندل میشه. پیشنهاد میکنم حتما داکیومنت‌های بخش معماری لاراول و مخصوصا service container بخونید چون جواب سوال شما در همون بخش اول این داکیومنت هست.

https://laravel.com/docs/9.x/container

موفق باشید ??

محمد حسن عاطفت ۱۴ خرداد ۱۴۰۱، ۱۲:۴۵

ممنون جناب عاطفت عزیز

اگر درست متوجه شده باشم، service container لاراول، dependency injectionها رو انجام میده و نیازی نیست که ما اینکار رو به صورت دستی انجام بدیم، درسته؟


به طور مثال توی همین موردی که الان داشتیم، توی کانستراکتور کنترلر MagicController ، یک آبجکت از کلاس Request ساخته میشه و به MagicAuthentication تزریق میشه؟

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

کاملا درست متوجه شدی پویا عزیز ?

بهترین پاسخ
محمد حسن عاطفت ۱۵ خرداد ۱۴۰۱، ۰۵:۳۲