当 Laravel 5.4 中的验证失败时,如何重定向回来?



我正在做一个Laravel 5.4项目,并且有多个具有相同URL
的页面,例如 www.blahblah.com/order/verify/{encryption_key}

我的路线是:

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

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

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

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

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

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

你看,FormRequest 类的 getRedirectUrl() 方法测试了类上的一些特殊属性,如果找不到任何值,它会使用 Illuminate\Routing\UrlGenerator::p revious() 生成的 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);
} 

以相同的方法(init())处理post请求不是更容易吗? 这样,您将需要重定向,但只需显示错误。

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

最新更新