Ich schreibe eine Webservice-API (in Version 4.2).
Aus irgendeinem Grund schlägt das Routing zu einem meiner Controller selektiv auf der Grundlage der HTTP-Methode fehl.
Meine routen.php sieht so aus:
Route::group(array('prefix' => 'v2'),
function()
{
Route::resource('foo', 'FooController',
[ 'except' => ['edit', 'create'] ]
);
Route::resource('foo.bar', 'FooBarController',
[ 'except' => ['show', 'edit', 'create'] ]
);
}
);
Wenn ich also eine der Methoden GET/POST/PUT/PATCH/DELETE für dieproject.dev/v2/foo
oder project.dev/v2/foo/1234
urls, alles funktioniert einwandfrei.
Aber aus irgendeinem Grund funktionieren nur GET und POST für project.dev/v2/foo/1234/bar
. Die anderen Methoden werfen einfach eine 405 (MethodNotAllowedHttpException) aus.
(fyi, ich stelle Anfragen über die Erweiterung Advanced Rest Client Chrome aus.)
Was ist los?
Was vermisse ich?
Gelöst!
Die Antwort kann durch Ausführen von php artisan routes
gefunden werden.
Das hat mir gezeigt, dass DELETE und PUT/PATCH eine Bar-ID erwarten (benötigen).
Ich habe das zufällig vernachlässigt, weil es nur einen bestimmten Typ von "Bar" geben kann. Das Problem lässt sich einfach beheben, indem Sie es einfach zu meinen URLs hinzufügen, wie zum Beispiel project.dev/v2/foo/1234/bar/5678
.
Für diejenigen, die Laravel Versionen> 4.2 verwenden, verwenden Sie Folgendes:
php artisan route:list
Dadurch wird die Liste der in Ihrer Anwendung festgelegten Routen angezeigt. Prüfen Sie, ob Routen für PUT und DELETE in Ihren Routen zulässig sind oder nicht.
Fügen Sie Ihrem Formular einfach ein verstecktes Eingabefeld hinzu
<input type="hidden" name="_method" value="PUT">
Und Formularmethode als Beitrag behalten
<form method="post" action="{{action('')}}">
Ich kenne keine älteren Laravel-Versionen. Aber ich benutze Laravel seit 5.2 und es ist notwendig, eine versteckte Methodeneingabe zu verwenden, wenn put, patch oder delete verwendet wird.
Ex:
<input type="hidden" name="_method" value="PUT">
Check https://laravel.com/docs/5.6/routing#form-method-spoofing