私は2つの場所に2つの異なるログインフォームで構成されるWebサイトを持っています。1つはナビゲーションバーにあり、もう1つはシステムがログに記録されていない訪問者をキャッチするときに使用されるログインページです。
ログインプロセスで何らかのエラーが発生した場合にカスタムログインページにリダイレクトする条件を設定したLoginRequest.phpで何が間違っているのかを尋ねることはできますか?私は以下のような私のコードを持っています:
<?php namespace App\Http\Requests;
use App\Http\Requests\Request;
class LoginRequest extends Request {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'login_email' => 'required',
'login_password' => 'required'
];
}
public function messages()
{
return [
'login_email.required' => 'Email cannot be blank',
'login_password.required' => 'Password cannot be blank'
];
}
public function redirect()
{
return redirect()->route('login');
}
}
このコードは、ログインページにエラーが発生した場合に、ナビゲーションバーからログインするユーザーをリダイレクトすることを想定していますが、リダイレクトされていないようです。
ありがとうございました。
解決策を見つけました。私がする必要があるのはからの最初の応答を上書きすることです
FormRequest.php
そのように、それは魅力のように機能します。
public function response(array $errors)
{
// Optionally, send a custom response on authorize failure
// (default is to just redirect to initial page with errors)
//
// Can return a response, a view, a redirect, or whatever else
if ($this->ajax() || $this->wantsJson())
{
return new JsonResponse($errors, 422);
}
return $this->redirector->to('login')
->withInput($this->except($this->dontFlash))
->withErrors($errors, $this->errorBag);
}
特定のURLにリダイレクトする場合は、protected $redirect
を使用します
class LoginRequest extends Request
{
protected $redirect = "/login#form1";
// ...
}
または、名前付きルートにリダイレクトする場合は、$redirectRoute
を使用します
class LoginRequest extends Request
{
protected $redirectRoute = "session.login";
// ...
}
Controller
でvalidate()
メソッドを使用している場合
$this->validate($request, $rules);
次に、拡張したbuildFailedValidationResponse
ベースに存在するValidatesRequests
トレイトからController
を上書きできます。
この線に沿った何か:
protected function buildFailedValidationResponse(Request $request, array $errors)
{
if ($request->expectsJson()) {
return new JsonResponse($errors, 422);
}
return redirect()->route('login');
}
リクエストでvalidateメソッドを使用したくない場合は、Validatorファサードを使用して手動でvalidatorインスタンスを作成できます。ファサードのmakeメソッドは、新しいバリデーターインスタンスを生成します。 Laravel Validation を参照してください。
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
if ($validator->fails()) {
return redirect('post/create')
->withErrors($validator)
->withInput();
}
// Store the blog post...
}