درود فراوان🌹 بنده می خوام در سیستم لاگین ، کاربر به دو روش لاگین با تلفن و یا ایمیل وارد سایت بشه اما به یک ارور بر می خورم و پکیج احراز هویت لاراول فورتی فای هست. این کد مربوط به کنترلر لاگین که وقتی کاربر رکوئست به فیلد تلفن میده میگه حتما باید ایمیل و پسورد وارد بشه. در صورتی که می خوام وقتی درخواست به فیلد فون بود فقط ولیدیشن مربوط به فون انجام شه که این تیکه از کد اجازه این کارو نمیده.
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();
}
خیلی ممنون میشم راهنماییم کنید چند روزه سر این گیر کردم🙏🙏🙏
با سلام ، سوال واسه 20 روز پیش هست ولی گفتم شاید به دردتون بخوره. وقتی بصورت Typehint شده یک ابجکت پاس میدین لاراول توسط سرویس کانتینرش میفهمه که چه آبجکتی میخواین و واستون میسازه بصورت خودکار. منظورم این خط هستش :
public function store(LoginRequest $request )
حالا شما اون رو حذف کردین و به متغیر request یک استرینگ نسبت دادین که طبیعتا متد authenticate روی اون کار نخواهد کرد و از شما انتظار ابجکت داره.
ClassName::class
همیشه اسم کلاس بهمراه namespace رو بصورت استرینگ برگشت میده.
دقیقا در اینجا باید یک آبجکت از کلاس LoginRequest بسازید ولی حالتی که نوشتین استرینگ دریافت خواهید کرد.
$request=LoginRequest::class;
میتونید اون مقدار ورودی متد Store رو حذف نکنید یا اینکه به هر طریقی که جواب میده یا با استفاده از new یا تابع resolve سرویس کانتینر لاراول یک آبجکت بسازید.
سلام
فکر میکنم مشکل از اینکه شما نمیتونید از این تابع داخل این فایل استفاده کنید و همونطور که از اسم تابعتون مشخصه باید در Controller ازش استفاده بشه و جاش اونجاست.
با سلام ، سوال واسه 20 روز پیش هست ولی گفتم شاید به دردتون بخوره. وقتی بصورت Typehint شده یک ابجکت پاس میدین لاراول توسط سرویس کانتینرش میفهمه که چه آبجکتی میخواین و واستون میسازه بصورت خودکار. منظورم این خط هستش :
public function store(LoginRequest $request )
حالا شما اون رو حذف کردین و به متغیر request یک استرینگ نسبت دادین که طبیعتا متد authenticate روی اون کار نخواهد کرد و از شما انتظار ابجکت داره.
ClassName::class
همیشه اسم کلاس بهمراه namespace رو بصورت استرینگ برگشت میده.
دقیقا در اینجا باید یک آبجکت از کلاس LoginRequest بسازید ولی حالتی که نوشتین استرینگ دریافت خواهید کرد.
$request=LoginRequest::class;
میتونید اون مقدار ورودی متد Store رو حذف نکنید یا اینکه به هر طریقی که جواب میده یا با استفاده از new یا تابع resolve سرویس کانتینر لاراول یک آبجکت بسازید.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟