Дать 404, если метод GET не поддерживается

У меня есть метод 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?

Вы не должны: URL-адрес указывает на реальный ресурс. Ответ 405 Method Not Allowed, который ваш маршрутизатор предположительно выдает по умолчанию, является правильным. Ошибка 404 Not Found неверна.

Quentin 08.05.2023 17:10

Если это веб-запрос, вы можете изменить обработчик ошибок, чтобы направить представление на общее сообщение 404. Ваш браузер по-прежнему будет возвращать ошибку 405, но для обычного пользователя это будет выглядеть как ошибка 404.

aynber 08.05.2023 17:14

@aynber я не совсем понимаю, где мне нужно это применить

baby 08.05.2023 17:23

Какую реальную проблему вы пытаетесь решить? Зачем вам получать запрос GET?

Snapey 08.05.2023 20:08

Решение состоит в том, чтобы всегда отправлять правильный тип запроса POST.

ceejayoz 08.05.2023 20:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
128
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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 результат должен быть точно таким же

marius-ciclistu 10.05.2023 17:14
laravel.com/docs/10.x/helpers#method-abort Функция прерывания выдает HTTP-исключение, которое будет обработано обработчиком исключений: Значение также регистрируется.
marius-ciclistu 10.05.2023 18:09

это проверит после того, как вы найдете метод (получите или опубликуйте), но если вы хотите выполнить какой-то код, тогда нет необходимости прерывать().

CHAUHAN DHARMESH 11.05.2023 07:17

поэтому я думаю, что это сработает, если вы хотите прервать получение маршрута

CHAUHAN DHARMESH 11.05.2023 07:18

Если у вас есть балансировщик нагрузки или ngnx впереди, они дадут вам другой 404, чем ваш laravel. Вот почему я спросил. Будет ли html-страница, загруженная в браузер, точно такой же, если вы просто вызовете исключение 404 (ваше прерывание делает именно это)?

marius-ciclistu 11.05.2023 15:51

для этого вам не нужно прерывать

CHAUHAN DHARMESH 12.05.2023 07:32

Неважно. Вы не понимаете.

marius-ciclistu 12.05.2023 08:44

извините за неудобства

CHAUHAN DHARMESH 12.05.2023 08:53

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