Laravel возвращает исключение MethodNotAllowedHttpException при отсутствии маршрутизации

#php #laravel #post #get #routing

#php #laravel #Публикация #получить #маршруты

Вопрос:

Я создал маршрут для покупки товара в laravel 5.7

 Route::post('/buy/item', "userController@buy_item")->name('buy_item_form');
  

Все работает нормально, но когда я обновляю страницу (заменяю на GET Request) Я получил
Исключение MethodNotAllowedHttpException.
Маршрут GET не существует, он должен возвращать ошибку 404.
Я не понимаю, почему он возвращает мне это исключение.

Ответ №1:

Вы используете post, с post у вас есть токен @csrf. когда вы нажимаете на обновить, вы выполняете метод GET вместо post и, следовательно, получаете метод not allow exception. Если вы не отправляете данные, вы можете изменить их на метод get [Route::get].

Если вы хотите принять 2 метода [post, get], чтобы улучшить работу и справиться с возможными ошибками. Вы можете принять 2 метода на маршруте, такие как:

 Route::match(array('GET','POST'),'/buy/item', 'userController@buy_item')->name('buy_item_form');
  

И на контроллере определите, что делать, основываясь на методе.

 if (Request::isMethod('get')){
    // redirect user
}

if (Request::isMethod('post')){
    // do logic for post method
}

  

Комментарии:

1. Я не создавал GET route. итак, почему я получил исключение при запросе GET, если маршрут не существует. Это должно вернуть мне ошибку 404.

2. когда вы обновляете страницу или переходите на нее с помощью метода get , если вы отправляете данные и устанавливаете для метода в форме значение post, он будет публиковать информацию вместо get. w3schools.com/tags/ref_httpmethods.asp

3. Я имею в виду, что я создал маршрут Post, и когда я пишу URL маршрута post в строке URL-адреса в моем браузере (делаю запрос get), он возвращает исключение, а не ошибку 404. Я могу создать get route, который выполнит прерывание (404), но в любом случае это не должно произойти?

4. добавьте это в свой код, и вы увидите, что вы выполняете get по маршруту обновления::get(‘/buy/item’, function(){ возвращает «Get Request»; });

5. Я могу сделать это: Route:: get(‘/buy / item’, function(){return abort(404)}); Но мой вопрос в том, почему это не происходит автоматически.