我的验证有问题 - 如果验证失败,我会收到错误。
Route::get('list', 'MainController@list');
Route::post('search', 'MainController@search');
Route::post('create', 'MainController@create');
list
显示完整的商品列表和搜索表单。表单发布到search
。 search
返回项目列表(搜索结果)和带有两个按钮的表单 - 再次搜索或创建新项目。此表单会发布到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
路径,这会给我带来更多问题。
答案 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命名,这让我觉得可能有一个选项,只是没有记录......