علیرضا
2 سال پیش توسط علیرضا مطرح شد
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();
    }

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


ثبت پرسش جدید
سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 2 سال پیش آپدیت شد
0

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

public function store(LoginRequest $request )

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

$request=LoginRequest::class; 

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


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

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


میلاد خسروی
تخصص : برنامه نویس بامزه
@milwad 2 سال پیش مطرح شد
0

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


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 2 سال پیش آپدیت شد
0

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

public function store(LoginRequest $request )

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

$request=LoginRequest::class; 

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


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

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