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

سلام

class EmailVerificationPromptController extends Controller
{
    /**
     * Display the email verification prompt.
     *
     * @param  \\Illuminate\\Http\\Request  $request
     * @return mixed
     */
    public function __invoke(Request $request)
    {
        return $request->user()->hasVerifiedEmail()
                    ? redirect()->intended(RouteServiceProvider::HOME)
                    : view('auth.verify-email');
    }
}

کار کلاس بالا اینکه اگه user ما verify نبود ی view برامون بفرسته و چون از مجیک متد invoke استفاده کرده پس باید بتونیم به صورت fanction اجراش کنیم

من اومدم در midlleware مون صداش زدم

    public function handle(Request $request, Closure $next)
    {
        if ($request->user() && !$request->user()->hasVerifiedEmail()) {
            $EmailVerificationPromptController = new EmailVerificationPromptController;
            return call_user_func($EmailVerificationPromptController);
        }
        return $next($request);
    }

ولی چیزی ک هس میگه argument ما یکی کم داره

Too few arguments to function App\\Http\\Controllers\\Auth\\EmailVerificationPromptController::__invoke(), 0 passed and exactly 1 expected

میشه راهنمایی کنید

سلام مهدی عزیز‌

پیام خطا به شما میگه که متد «__invoke()» در کلاس «EmailVerificationPromptController» انتظار یک آرگومان را داره که نمونه ای از کلاس «Illuminate\\Http\\Request» باشه.

پس وقتی که متد «__invoke()» را با استفاده از «call_user_func($EmailVerificationPromptController)» فراخوانی می‌کنی، هیچ آرگومانی را به متد ارسال نمی‌کنی که باعث ایجاد خطا می‌شه.

برای رفع این خطا، زمان فراخوانی باید نمونه ای از کلاس «Illuminate\\Http\\Request» را به متد «__invoke()» ارسال کنی. این کارو با پاس دادن متغیر «$request» به تابع «call_user_func()» به این شکل اوکی کن:

call_user_func([$EmailVerificationPromptController, '__invoke'], $request);

این متغیر «$request» رو به‌عنوان آرگومان به متد «__invoke()» منتقل می‌کنه.

احمدرضا فاطمی کیا ۲۳ اسفند ۱۴۰۱، ۱۲:۳۴

وقتی کلاس رو call user fanc صدا بزنی اگه متد invoke داشته باشه ک اوتو فراخوان میشه

بخاطر همین به این صورت خطای

call_user_func([$EmailVerificationPromptController, '__invoke'], $request);

وجود نداشتن متد رو میگیریم



Mahdi ۲۳ اسفند ۱۴۰۱، ۱۳:۵۸

با توجه به خطایی که مشاهده می‌کنی، ممکنه متغیر '$EmailVerificationPromptController' به درستی ست نشده باشه، که باعث می‌شود پیام خطا در مورد روش `__invoke()` وجود نداشته باشه.

برای رفع این خطا، می‌تونی مستقیماً کلاس «EmailVerificationPromptController» رو نمونه‌سازی کنی، مثل این:

$controller = new \\App\\Http\\Controllers\\Auth\\EmailVerificationPromptController;
$controller($request);

این یک نمونه جدید از کلاس «EmailVerificationPromptController» ایجاد می‌کنه و متد «__invoke()» اون رو با آرگومان «$request» فراخوانی می‌کنه.

همچنین، می‌تونی از تابع «app()» برای حل نمونه کنترلر از کانتینر استفاده کنیی، مانند این:

$controller = app(\\App\\Http\\Controllers\\Auth\\EmailVerificationPromptController::class);
$controller($request);

این از کانتینر سرویس لاراول برای حل نمونه کنترلر استفاده می‌کنه.

احمدرضا فاطمی کیا ۲۳ اسفند ۱۴۰۱، ۱۶:۰۲

در دو حالت به خطا میخوریم اولی setCoki onNull

Call to a member function setCookie() on null

برای دومی هم

Illegal offset type in isset or empty
Mahdi ۲۴ اسفند ۱۴۰۱، ۱۲:۱۲

سلام مهدی جان، به نظرم میتونید برای کاری که میخواید انجام بدید به شیوه دیگه ای عمل کنی.

میدلورتون رو به شکل زیر تغییر بدید:

public function handle(Request $request, Closure $next)
{
    if ($request->user() && ! $request->user()->hasVerifiedEmail()) {
        return redirect()->route('email.verify');
    }
    return $next($request);
}

اگه میخواید همچنان با روش خودتون پیش برید میتونید کدتون رو به صورت زیر اصلاح کنید:

public function handle(Request $request, Closure $next)
{
    if ($request->user() && ! $request->user()->hasVerifiedEmail()) {
        $controller = app(EmailVerificationPromptController::class);
        $response = $controller($request);
        return response($response);
    }
    return $next($request);
}
بهترین پاسخ
صادق برزگر ۲۵ اسفند ۱۴۰۱، ۰۱:۳۷

مچکر از شما

Mahdi ۲۷ اسفند ۱۴۰۱، ۱۹:۴۸