У меня есть код ниже. Он принимает ввод формы и направляет его как сообщение. Входные данные ищутся в модели и возвращаются результаты. Приведенный ниже код РАБОТАЕТ во всех сценариях, кроме одного.
Введен поисковый запрос, удовлетворяющий проверке. Второй поиск выполняется без записи. Это возвращает ошибку.
Примечание. Пустой поиск допустим, если он выполняется с «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);
}






Вероятно, это перенаправление на /search, и у вас нет соответствующего маршрута GET для этого URL.
Я бы отказался от требований к минимальной длине, возможно, проверил бы длину в действии контроллера и вернул бы что-нибудь в любом случае. Пользователи ожидают обратной связи, даже если их вклад отсутствует, но это обсуждение UX.
Сообщите мне, поможет ли удаление min:2 из запроса.
Я поменял некоторые вещи, и вы правы, он пытается использовать вызов GET, даже если форма настроена на публикацию
Я бы посмотрел, как ваш класс 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);}); }
«Класс App \ Http \ Controllers \ Exception не существует» Я добавил use App \ Http \ Controllers \ Exception;
Я удалил мин: 2. Без изменений. Как вы думаете, бутстрап все испортил?