Laravel 5自定义验证重定向

时间:2015-05-30 10:04:11

标签: php laravel laravel-5 laravel-routing laravel-validation

我有一个网站,其中包含两个不同的登录表单,分别位于2个位置,一个位于导航栏上,另一个是登录页面,系统会在系统捕获未记录的访问者时使用。

我是否可以在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');
    }
}

如果登录页面有任何错误但代码似乎没有重定向,则代码会重定向从导航栏登录的用户。

谢谢。

6 个答案:

答案 0 :(得分:7)

找到解决方案。我需要做的就是覆盖

的初始响应
  

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

答案 1 :(得分:3)

如果您想重定向到特定网址,请使用protected $redirect

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

    // ...
}

或者如果要重定向到指定路线,请使用$redirectRoute

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

    // ...
}

答案 2 :(得分:1)

如果您在validate()

上使用Controller方法
$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 :(得分:1)

如果您不想对请求使用validate方法,可以使用Validator外观手动创建验证程序实例。 Facade上的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...
    }

答案 4 :(得分:1)

这在Lara 7中有效 如果验证失败,请添加锚点以跳至评论表单

protected function getRedirectUrl()
{
    return parent::getRedirectUrl() . '#comment-form';
}

答案 5 :(得分:0)

已经提供了此答案的变体,但是覆盖 custom request 中的 getRedirectUrl() 方法可以让您定义路由参数,而不仅仅是 $redirectRoute 属性的名称优惠。