Я пишу API веб-сервиса (в laravel 4.2).
По какой-то причине маршрутизация на один из моих контроллеров выборочно завершается с ошибкой на основе метода HTTP.
Мой route.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
URL-адреса, все работает отлично.
Но по какой-то причине только GET и POST работают на project.dev/v2/foo/1234/bar
, Другие методы просто выдают 405 (MethodNotAllowedHttpException).
(Кстати, я выдаю запросы через Расширенный Отдых Клиента Расширение Chrome.)
В чем дело?
Что мне не хватает?
Решено!
Ответ можно найти, запустив php artisan routes
,
Это показало мне, что DELETE и PUT / PATCH ожидают (требуют) идентификатор бара.
Я случайно пренебрегал этим, потому что может быть только один из этого типа «бара». Легко исправить это, просто добавив его в мой URL независимо от того, как project.dev/v2/foo/1234/bar/5678
,
Для тех, кто использует версии Laravel> 4.2, используйте это:
php artisan route:list
Это даст список маршрутов, установленных в вашем приложении. Проверьте, разрешены ли маршруты для PUT и DELETE в ваших маршрутах или нет.
Ошибка 405 в основном из-за отсутствия маршрута для этих методов.
Я не знаю о старых версиях Laravel. Но я использую Laravel начиная с 5.2, и необходимо использовать скрытый метод ввода при использовании put, patch или delete.
Пример:
<input type="hidden" name="_method" value="PUT">
Проверьте https://laravel.com/docs/5.6/routing#form-method-spoofing