У меня есть метод POST на моем маршруте
Route::post('blog/{id}', 'App\Http\Controllers\BlogController@sendGrade');
А когда я еще и POST указываю в запросе, то все нормально
$.ajax({
type: 'POST',
Но когда запрос GET, я получу ошибку
Метод GET не поддерживается для этого маршрута. Поддерживаемые методы: POST.
Это все очевидно, но можно ли этого избежать, чтобы если в запросе есть метод GET, то вместо этой ошибки я бы получил ошибку 404?
Насколько я понимаю, это можно сделать в контроллере. Прямо сейчас у меня есть что-то подобное, когда запись не существует
if (!$blog){
return abort(404);
}
Можно ли сделать то же самое для метода GET?
Если это веб-запрос, вы можете изменить обработчик ошибок, чтобы направить представление на общее сообщение 404. Ваш браузер по-прежнему будет возвращать ошибку 405, но для обычного пользователя это будет выглядеть как ошибка 404.
@aynber я не совсем понимаю, где мне нужно это применить
Какую реальную проблему вы пытаетесь решить? Зачем вам получать запрос GET?
Решение состоит в том, чтобы всегда отправлять правильный тип запроса POST.






Route::match(['get', 'post'], 'blog/{id}', 'App\Http\Controllers\BlogController@sendGrade');
/**
* @throws NotFoundHttpException
*/
public function sendGrade(string $id, Request $request): Response
{
if ($request->getMethod() === 'GET') {
throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
}
// code
}
в исключениях/handler.php
protected $dontReport = [
NotFoundHttpException::class
];
/**
* @inheritDoc
*/
public function render($request, \Throwable $e)
{
if ($e instanceof NotFoundHttpException) {
try {
/** @var Client $guzzleClient */
$guzzleClient = \resolve(Client::class); // register the Client in appServiceProviders.php as singleton for example
$result = $guzzleClient->get('/getNotFoundEndpoint');
$body = $result->getBody()->getContents();
} catch (\Throwable $e) {
}
return \response($body ?? '', 404);
}
return parent::render($request, $e);
}
добавьте этот маршрут в ваш файл web.php
Route::get('blog/{id}', function () {
abort(404);
});
это сработает 100%
Будет ли это выглядеть именно как незарегистрированный маршрут? Скажите make GET /something результат должен быть точно таким же
это проверит после того, как вы найдете метод (получите или опубликуйте), но если вы хотите выполнить какой-то код, тогда нет необходимости прерывать().
поэтому я думаю, что это сработает, если вы хотите прервать получение маршрута
Если у вас есть балансировщик нагрузки или ngnx впереди, они дадут вам другой 404, чем ваш laravel. Вот почему я спросил. Будет ли html-страница, загруженная в браузер, точно такой же, если вы просто вызовете исключение 404 (ваше прерывание делает именно это)?
для этого вам не нужно прерывать
Неважно. Вы не понимаете.
извините за неудобства
Вы не должны: URL-адрес указывает на реальный ресурс. Ответ 405 Method Not Allowed, который ваш маршрутизатор предположительно выдает по умолчанию, является правильным. Ошибка 404 Not Found неверна.