web-dev-qa-db-ja.com

Laravel 5カスタム検証リダイレクト

私は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');
    }
}

このコードは、ログインページにエラーが発生した場合に、ナビゲーションバーからログインするユーザーをリダイレクトすることを想定していますが、リダイレクトされていないようです。

ありがとうございました。

9
Kenny Yap

解決策を見つけました。私がする必要があるのはからの最初の応答を上書きすることです

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);
}
7
Kenny Yap

特定のURLにリダイレクトする場合は、protected $redirectを使用します

class LoginRequest extends Request
{
    protected $redirect = "/login#form1";

    // ...
}

または、名前付きルートにリダイレクトする場合は、$redirectRouteを使用します

class LoginRequest extends Request
{
    protected $redirectRoute = "session.login";

    // ...
}
4
dokko

Controllervalidate()メソッドを使用している場合

$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');
}
3
musicvicious

リクエストで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...
    }