如何更改Laravel';什么是退货?

如何更改Laravel';什么是退货?,laravel,laravel-5,Laravel,Laravel 5,我有一个验证问题-如果验证失败,我会得到一个错误 Route::get('list', 'MainController@list'); Route::post('search', 'MainController@search'); Route::post('create', 'MainController@create'); list显示完整的项目列表和搜索表单。表单将发布到搜索搜索返回项目列表(搜索结果)和带有两个按钮的表单-再次搜索或创建新项目。此表单发布到create,但如果按下搜索按钮

我有一个验证问题-如果验证失败,我会得到一个错误

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

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

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

    return 0;
}
如果点击了
search
,一切正常。如果验证通过,则所有操作都有效(我可以包含逻辑,而不是
返回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的验证器实现,但无法真正理解流程并找到请求返回的位置。有没有可能影响它的方式,使客户得到的结果,以前的文章再次

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


但是,如果我再次使用“搜索”按钮,该按钮将发布到
create
,并返回相同的视图,则验证程序将重定向以获取
create
路径,这会给我带来更多问题。请确保您的创建和搜索操作都有自己的形式,并且有一个与之相关联的不同操作url(或路径)。是否您的“创建”按钮没有发布到/create路由,而是发布到不同的路径


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

我最终解决问题的方法是手动检查,如果失败,则刷新错误,并将请求重定向到搜索方法:

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()
添加到方法调用中,它实际上会向会话中闪烁错误。如果我知道手动验证可以很容易地查找和显示错误,我甚至不会问这个问题

然而,现在已经发布了,问题仍然存在-您能否调整从
validateRequests
trait获得的方法
$this->validate()
所做的重定向


知道您可以通过创建FormRequest来调整errorBag命名,我认为可能有一个选项,只是没有记录…

Create和search具有相同的表单和操作url,但即使我只有一个带有验证的搜索操作,我也会遇到同样的问题。如果您通过POST到达上一个视图,并且GET请求无法访问该路由,$this->validate()似乎不会将您返回到上一个视图。您可以根据需要覆盖控制器中的适当方法,例如buildFailedValidationResponse()或getRedirectUrl()。但我认为手动操作会更可靠,就像您在自己的回答中解释的那样。或者考虑为您的搜索url创建一个GET路由,它也可以用于在发布到搜索后显示搜索结果(然后重定向到此GET路由以获取结果)。我更喜欢使用GET来显示结果,而不是POST。希望这是有道理的。