在Laravel 5.4中验证失败时如何重定向?

时间:2018-01-15 21:05:28

标签: php laravel laravel-5 routes

我正在使用Laravel 5.4项目,并且有多个网页使用相同的网址。 www.blahblah.com/order/verify/{encryption_key}

我的溃败是:

Route::get('/order/verify/{encrypted_key}','PinVerificationController@init');
Route::post('/order/verify/{encrypted_key}','PinVerificationController@pinValidation');

流量是他们首先登陆页面,然后输入他们的电话号码,然后他们进入第二页,他们必须输入密码。我验证密码是否是一个数字,如果不是,那么我会重新定向并返回错误信息。但他们正被重定向到第一页。

如果验证失败,我将返回路由。我正在做

return \Redirect::back()->withInput()->withErrors($validator);

但这是路由到GET页面而不是POST页面。

为什么会发生这种情况? 更新#1

    public function init(){

    $country_extensions = appUtils::getCountryExtensionDropdown();

    //TODO
    $country_iso_code = "1-US";
    $parameters = compact( 'country_extensions','country_iso_code' );

    return view('/pages/choose_phone_verify_method',$parameters);

}

private function pinValidation(Request $request){
    $validator = \Validator::make($request->all(), [
        'pin_number' => 'required|numeric'
    ]);

    if ($validator->fails()) {
        return \Redirect::back()->withInput()->withErrors($validator);
    } 
}

2 个答案:

答案 0 :(得分:0)

我不知道您是在控制器中还是在请求中进行验证。但是我可以看到你重定向back(),它必须来自你的控制器。

我的建议是你在控制器中使用formRequest类而不是验证器。

你看,FormRequest类的getRedirectUrl()方法测试了类上的一些特殊属性,如果它没有找到任何值,它会使用Illuminate \ Routing \ UrlGenerator回退到重定向: :previous()生成的URL。 FormRequest检查的那些属性是您拥有的重定向选项。

现在,通过将属性放在每个表单请求类继承的抽象类App \ Http \ Requests \ Request中,您可以通过两种方式更改它们,或者在每个表单请求中进行全局更改。或者,特别是表单类,只需将它们放在表单类本身中即可。

这些是您自定义重定向的所有选项:

protected $redirect; // A simple URL. ex: google.com
protected $redirectRoute; // A route name to redirect to.
protected $redirectAction; // A controller action to redirect to.

但如果您坚持在控制器中进行验证,则可以编写if语句。这样如果验证器失败,它会在这种情况下重定向到特定路径,如第2页路径。像下面这段代码:

if ($validator->fails()) {
        return redirect('path to page 2')->withInput()->withErrors($validator);
    } 

或者您可以重定向到路线名称:

 if ($validator->fails()) {
    return redirect(route('route name'))->withInput()->withErrors($validator);
} 

答案 1 :(得分:0)

使用相同的方法(init())处理post请求会更容易。 这样你就需要重定向,但只显示错误。

用户可以轻松纠正错误(因为表单可以填写,并且会自动再次显示)并再次提交表单。