راکت
حل شده

باگ مربوط به کنترلر لاگین در لاراول

3 پاسخ

درود فراوان🌹 بنده می خوام در سیستم لاگین ، کاربر به دو روش لاگین با تلفن و یا ایمیل وارد سایت بشه اما به یک ارور بر می خورم و پکیج احراز هویت لاراول فورتی فای هست. این کد مربوط به کنترلر لاگین که وقتی کاربر رکوئست به فیلد تلفن میده میگه حتما باید ایمیل و پسورد وارد بشه. در صورتی که می خوام وقتی درخواست به فیلد فون بود فقط ولیدیشن مربوط به فون انجام شه که این تیکه از کد اجازه این کارو نمیده.

 public function store(LoginRequest $request)

ولی وقتی LoginRequest $request به این صورت و داخل خود تابع می گذارم احراز هویت فون انجام میشه ولی این ارور میده

Call to a member function authenticate() on string

کد کنتلر لاگین

 protected Request $request;
    public function __construct(Request $request)
    {
        $this->request=$request;
    }

    public function store()
    {
//      داخل استور پاک کردم  public function store($request LoginRequest) اینجا تغییر دادم
// یعنی   و خط پایینی اضافه کردم 
        $request=LoginRequest::class;
//        ***********************************************
        if ($this->request->email || $this->request->password){
//باگ مربوط به این خطه
        $request->authenticate();
        $request->session()->regenerate();

        alert()->success('ورود شما با موفقیت انجام شد', 'خانه هوشمند آریا')->autoclose('4000');
        return redirect()->intended(RouteServiceProvider::HOME);
        }
        //***********************************validate if request for phone*********************************
        elseif ($this->request->phone){
            $validData = $this->request->validate([
                'phone' => ['required', 'regex:/^09(1[0-9]|3[1-9]|2[1-9])-?[0-9]{3}-?[0-9]{4}$/', 'exists:users,phone']
            ]);

            $user=User::wherePhone($validData['phone'])->first();
            $this->request->session()->flash('login',[
               'user_id'=>$user->id,
                'remember'=>$this->request->has('remember')
            ]);
            //Send SMS For User
            $code=ActiveCode::GenerateCode($user);
            $user->notify(new ActiveCodeNotification($code,$user->phone));
            return redirect(route('token.login.get'));
        }
    }

این هم کد داخل LoginRequest

  public function authorize()
    {
        return true;
    }
   //*********************
    public function rules()
    {
        return [
            'email' => ['required', 'string', 'email'],
            'password' => ['required', 'string'],
        ];
    }
    //****************************
    public function authenticate()
    {
        $this->ensureIsNotRateLimited();

        if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
            RateLimiter::hit($this->throttleKey());

            throw ValidationException::withMessages([
                'email' => __('auth.failed'),
            ]);
        }

        RateLimiter::clear($this->throttleKey());
    }
    //****************************************
    public function ensureIsNotRateLimited()
    {
        if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
            return;
        }

        event(new Lockout($this));

        $seconds = RateLimiter::availableIn($this->throttleKey());

        throw ValidationException::withMessages([
            'email' => trans('auth.throttle', [
                'seconds' => $seconds,
                'minutes' => ceil($seconds / 60),
            ]),
        ]);
    }

//************************
    public function throttleKey()
    {
        return Str::lower($this->input('email')).'|'.$this->ip();
    }

خیلی ممنون میشم راهنماییم کنید چند روزه سر این گیر کردم🙏🙏🙏

ثبت پرسش جدید

پاسخ‌ها

3
سبحان دادخواه
سبحان دادخواه
@SobhanDadkhah

تخصص: دانشجوی برنامه نویسی :)

بهترین پاسخ

با سلام ، سوال واسه 20 روز پیش هست ولی گفتم شاید به دردتون بخوره. وقتی بصورت Typehint شده یک ابجکت پاس میدین لاراول توسط سرویس کانتینرش میفهمه که چه آبجکتی میخواین و واستون میسازه بصورت خودکار. منظورم این خط هستش :

public function store(LoginRequest $request )

حالا شما اون رو حذف کردین و به متغیر request یک استرینگ نسبت دادین که طبیعتا متد authenticate روی اون کار نخواهد کرد و از شما انتظار ابجکت داره.
ClassName::class همیشه اسم کلاس بهمراه namespace رو بصورت استرینگ برگشت میده.
دقیقا در اینجا باید یک آبجکت از کلاس LoginRequest بسازید ولی حالتی که نوشتین استرینگ دریافت خواهید کرد.

$request=LoginRequest::class; 

میتونید اون مقدار ورودی متد Store رو حذف نکنید یا اینکه به هر طریقی که جواب میده یا با استفاده از new یا تابع resolve سرویس کانتینر لاراول یک آبجکت بسازید.

احسان داوری
احسان داوری
@ehsndvr

تخصص: برنامه نویس

سلام
فکر میکنم مشکل از اینکه شما نمیتونید از این تابع داخل این فایل استفاده کنید و همونطور که از اسم تابعتون مشخصه باید در Controller ازش استفاده بشه و جاش اونجاست.

میلاد خسروی
میلاد خسروی
@milwad

تخصص: برنامه نویس بامزه

سلام خسته نباشید
شما تابع داخل requests زدی و این فکر کنم اشتباه هست

شاید پاسخ شما همین‌جا باشد

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام