web-dev-qa-db-de.com

Laravel: Route :: resource () GET & POST funktionieren, aber PUT & DELETE werfen MethodNotAllowedHttpException

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 die
project.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?

11
mOrloff

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.

18
mOrloff

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.

6
stackMonk

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('')}}">
0
nihar nayak

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

0
guizo