2015-12-29 2 views
0

У меня проблема с проверкой - если проверка не удалась, я получаю сообщение об ошибке.Как изменить метод перенаправления и полезную нагрузку, возвращаемую валидатом Laravel?

Route::get('list', '[email protected]'); 
Route::post('search', '[email protected]'); 
Route::post('create', '[email protected]'); 

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?

Если я попытаюсь разрешить запросы GET на моем search, проблема частично решена. Если я выберу из полного списка и затем нажмите «Создать», проверка вернет мне снова search. Не имея результатов, я должен все же реализовать какой-то «если проверка не завершена, обрабатывайте это как запрос поиска». Ну, ладно, но мне все еще нужно то, что было опубликовано ...

Если, однако, я использую кнопку «Искать снова», которая помещается в create и возвращает тот же вид, валидатор перенаправляет GET маршрут create, который дает мне больше проблемы, с которыми приходится иметь дело.

ответ

0

Убедитесь, что ваши творения и ваши действия поиска имеют свою форму с определенным URL-адресом действия (или маршрутом), связанным с ними. Может ли быть, что ваша кнопка создания не отправляется на маршрут/create, а что-то другое?

Кроме того, если вы убедитесь, что у обоих есть своя форма, вызов $this->search() из вашего метода создания не требуется; маршрутизатор направит оба почтовых вызова на правильный метод.

+0

Создание и поиск имеют одинаковый вид и URL-адрес действия, но даже если бы у меня было только действие поиска с проверкой, у меня была бы такая же проблема. Кажется, что $ this-> validate() не вернет вас к предыдущему виду, если вы добрались туда, выполнив POST, и маршрут недоступен с запросом GET. –

+0

Посмотрите на признак ValidatesRequests. Вы можете переопределить соответствующий метод в вашем контроллере, например. buildFailedValidationResponse() или getRedirectUrl(), в соответствии с вашими потребностями. – Michiel

+0

Но я думаю, что было бы более надежно делать это вручную, как вы объяснили в своем собственном ответе. Это или если вы действительно хотите создать маршрут GET для своего поискового url, который также может использоваться для отображения результатов поиска после POSTing для поиска (а затем перенаправления на этот маршрут GET для результатов). Я бы предпочел использовать GET для отображения результатов через POST в любом случае. Надеюсь, это имеет смысл. – Michiel

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?

Зная, что вы можете настроить присвоение errorBag, создав FormRequest, заставляет меня думать, что для этого может быть вариант, просто не документированный ...

Смежные вопросы