У меня проблема с проверкой - если проверка не удалась, я получаю сообщение об ошибке.Как изменить метод перенаправления и полезную нагрузку, возвращаемую валидатом 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
, который дает мне больше проблемы, с которыми приходится иметь дело.
Создание и поиск имеют одинаковый вид и URL-адрес действия, но даже если бы у меня было только действие поиска с проверкой, у меня была бы такая же проблема. Кажется, что $ this-> validate() не вернет вас к предыдущему виду, если вы добрались туда, выполнив POST, и маршрут недоступен с запросом GET. –
Посмотрите на признак ValidatesRequests. Вы можете переопределить соответствующий метод в вашем контроллере, например. buildFailedValidationResponse() или getRedirectUrl(), в соответствии с вашими потребностями. – Michiel
Но я думаю, что было бы более надежно делать это вручную, как вы объяснили в своем собственном ответе. Это или если вы действительно хотите создать маршрут GET для своего поискового url, который также может использоваться для отображения результатов поиска после POSTing для поиска (а затем перенаправления на этот маршрут GET для результатов). Я бы предпочел использовать GET для отображения результатов через POST в любом случае. Надеюсь, это имеет смысл. – Michiel