Laravel: Route:: resource() GET & POST работает, но PUT & DELETE throw MethodNotAllowedHttpException

Я пишу API webservice (в laravel 4.2).
По какой-то причине маршрутизация на один из моих контроллеров выборочно терпит неудачу на основе метода HTTP.

Мои маршруты .php выглядят так:

Route::group(array('prefix' => 'v2'), 
    function()
    {
        Route::resource('foo', 'FooController',
            [ 'except' => ['edit', 'create'] ]
            );
        Route::resource('foo.bar', 'FooBarController',
            [ 'except' => ['show', 'edit', 'create'] ]
            );
    }
);

Итак, когда я пытаюсь использовать методы GET/POST/PUT/PATCH/DELETE для project.dev/v2/foo или project.dev/v2/foo/1234, все работает отлично.

Но по какой-то причине только GET и POST работают для project.dev/v2/foo/1234/bar. Другие методы просто кидают 405 (MethodNotAllowedHttpException).
(fyi, я отправляю запросы через расширение расширенного клиента клиента Rest Rest.)

Что происходит?
Что мне не хватает?

Ответ 1

Решено!
Ответ можно найти, запустив php artisan routes.

Это показало мне, что DELETE и PUT/PATCH ожидают (требуют) идентификатора панели.
Мне было пренебречь этим, потому что может быть только один из этого конкретного типа "бар". Легко исправить это, просто добавив его к моему URL независимо, например project.dev/v2/foo/1234/bar/5678.

Ответ 2

Для тех, кто использует версии Laravel> 4.2, используйте это:

php artisan route:list

Это даст список маршрутов, установленных в вашем приложении. Проверьте, разрешены ли маршруты для PUT и DELETE в ваших маршрутах или нет. Ошибка 405 в основном из-за отсутствия маршрута для этих методов.

Ответ 3

Я не знаю о старых версиях Laravel. Но я использую Laravel начиная с 5.2, и необходимо использовать скрытый метод ввода при использовании put, patch или delete.

Пример:

<input type="hidden" name="_method" value="PUT"> 

Проверьте https://laravel.com/docs/5.6/routing#form-method-spoofing

Ответ 4

Просто добавьте скрытое поле ввода в вашу форму

    <input type="hidden" name="_method" value="PUT">

И сохраните метод формы как пост

    <form method="post" action="{{action('')}}">