如何更改Laravel验证返回的重定向方法和有效负载?

时间:2015-12-29 13:12:29

标签: laravel laravel-5

我的验证有问题 - 如果验证失败,我会收到错误。

Route::get('list', 'MainController@list');
Route::post('search', 'MainController@search');
Route::post('create', 'MainController@create');

list显示完整的商品列表和搜索表单。表单发布到searchsearch返回项目列表(搜索结果)和带有两个按钮的表单 - 再次搜索或创建新项目。此表单会发布到create,但如果按下“搜索”按钮,则会调用search方法。如果使用“创建”按钮提交表单,则验证输入。这是我的create方法的简化版本:

public function create(Request $request)
{
    if ($request->has('search'))
        return $this->search($request);

    $this->validate($request, [
        'name' => 'required'
    ]);

    return 0;
}

如果点击search,则一切正常。如果验证通过则所有工作(我可以包括逻辑而不是return 0;)。但如果验证失败,我会收到以下错误:

MethodNotAllowedHttpException in RouteCollection.php line 219:
in RouteCollection.php line 219
at RouteCollection->methodNotAllowed(array('POST')) in RouteCollection.php line 206
at RouteCollection->getRouteForMethods(object(Request), array('POST')) in RouteCollection.php line 158
at RouteCollection->match(object(Request)) in Router.php line 802
at Router->findRoute(object(Request)) in Router.php line 670
at Router->dispatchToRoute(object(Request)) in Router.php line 654
at Router->dispatch(object(Request)) in Kernel.php line 246
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 132
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99
at Kernel->handle(object(Request)) in index.php line 53

问题似乎与路由有关,浏览器调试器确实显示它正在发送GET请求。

我试图调查Laravel的验证器实现,但无法真正理解流程并找到返回请求的位置。有没有机会以某种方式影响它,以便客户端再次获得之前POST的结果?

如果我尝试在search上允许GET请求,问题就会得到部分解决。如果我从完整列表中搜索然后单击“创建”,验证将再次返回search。虽然没有结果,但我仍然应该实现某种“如果验证失败,将其作为搜索请求处理”。好吧,好吧,但我仍然需要张贴的内容...

但是,如果我使用“再次搜索”按钮发布到create并返回相同的视图,则验证程序会重定向到GET create路径,这会给我带来更多问题。

2 个答案:

答案 0 :(得分:0)

确保您的创建和搜索操作都有自己的表单,并带有与之关联的独特操作网址(或路由)。可能是你的创建按钮没有发布到/创建路径,而是发布到不同的东西?

此外,如果您确保两者都有自己的表单,则无需在您的创建方法中调用$this->search();路由器将两个post调用路由到正确的方法。

答案 1 :(得分:0)

我最终要解决的问题是手动检查以及是否失败 - 闪存错误并将请求重定向到搜索方法:

public function create(Request $request)
{
    $validation = Validator::make($request->all(), [
        'name' => 'required'
    ]);

    if ($request->has('search') || $validation->fails())
        return $this->search($request)->withErrors($validation);

    return 0;
}

我有点惊讶我可以将->withErrors()添加到方法调用中,它实际上会向会话闪烁错误。如果我通过手动验证知道研究和闪烁错误很容易,我甚至不会问这个问题。

但是,现在它已发布,问题仍然存在 - 您是否可以调整从$this->validate()特征获得的方法ValidatesRequests所做的重定向?

知道你可以通过创建FormRequest来调整errorBag命名,这让我觉得可能有一个选项,只是没有记录......