Форма Laravel после повторных попыток автоматически переключается с вызова POST на вызов GET

У меня есть код ниже. Он принимает ввод формы и направляет его как сообщение. Входные данные ищутся в модели и возвращаются результаты. Приведенный ниже код РАБОТАЕТ во всех сценариях, кроме одного.

Введен поисковый запрос, удовлетворяющий проверке. Второй поиск выполняется без записи. Это возвращает ошибку.

Примечание. Пустой поиск допустим, если он выполняется с «LocalHost». Когда это делается в LocalHost / search /, выдается ошибка.

Обновлено: он пытается выполнить вызов GET, даже если метод формы является публикацией.

ОШИБКА

Users/$user/Desktop/store/store/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
No message

HTML

<form method = "POST" action = "/search/" class = "form-inline my-2 my-lg-0">
          {{csrf_field()}}
<input type = "text" name = "search" class = "form-control mr-sm-2" placeholder = "Search">
<button type = "submit" class = "btn btn-outline-success my-2 my-sm-0">Search</button>
</form>

Маршрутизатор

Route::post('/search', 'ProductController@search');

Функция контроллера

public function search(Request $request)
{

$request->validate([
  'search' => 'required|min:2'
]);

$term = $request->input('search');

$products = Product::search($term)->get();
return view('products.index', compact('products'));

}

Объем модели

public function scopeSearch($query, $term)
{
  return $query->where('name', $term);
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
75
2

Ответы 2

Вероятно, это перенаправление на /search, и у вас нет соответствующего маршрута GET для этого URL.

Я бы отказался от требований к минимальной длине, возможно, проверил бы длину в действии контроллера и вернул бы что-нибудь в любом случае. Пользователи ожидают обратной связи, даже если их вклад отсутствует, но это обсуждение UX.

Сообщите мне, поможет ли удаление min:2 из запроса.

Я удалил мин: 2. Без изменений. Как вы думаете, бутстрап все испортил?

seamus 18.04.2018 20:26

Я поменял некоторые вещи, и вы правы, он пытается использовать вызов GET, даже если форма настроена на публикацию

seamus 18.04.2018 20:39

Я бы посмотрел, как ваш класс App\Exceptions\Handler обрабатывает исключения ValidationExceptions. Я согласен с SLow Loris, что-то где-то перенаправляет запрос на действие GET, и там может быть перенаправление. Также возможна ошибка конфигурации сервера. Я видел, как это происходило, когда запросы http, перенаправляемые Apache на https, теряли из виду действие и параметры в процессе. Кажется менее вероятным, поскольку ваш первоначальный POST работает, но, возможно, на него стоит взглянуть.

Если вы знаете, какой маршрут предпринимается, вы можете проверить это, установив новую фиктивную конечную точку GET, которая просто печатает оператор отладки. Если вы не знаете, что это за маршрут, и вам нужно выяснить, поскольку no message не очень информативен, добавьте что-то вроде этого в этот класс Handler:

public function render ($request, Exception $e)
{
    if ($e instanceof MethodNotAllowedHttpException) {
        dd($e->getHeaders())
    }
}

Если заголовки запроса не ссылаются на запрашиваемый маршрут, вы можете временно изменить api/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php::getRouteForMethods() и заставить его печатать более подробную информацию об объекте $request непосредственно перед вызовом метода methodNotAllowed. Если бы я угадал, $request->path() укажет вам правильное направление.

возвращает: общедоступная статическая функция fromAction (массив $ action, $ subClass = null) {$ parameters = is_string ($ action ['uses'])? static :: fromClassMethodString ($ action ['uses']): (new ReflectionFunction ($ action ['uses'])) -> getParameters (); вернуть is_null ($ subClass)? $ parameters: array_filter ($ parameters, функция ($ p) use ($ subClass) {return $ p-> getClass () && $ p-> getClass () -> isSubclassOf ($ subClass);}); }

seamus 18.04.2018 20:33

«Класс App \ Http \ Controllers \ Exception не существует» Я добавил use App \ Http \ Controllers \ Exception;

seamus 18.04.2018 20:34

Другие вопросы по теме