web-dev-qa-db-fra.com

Laravel: Route :: resource () GET & POST fonctionne, mais PUT & DELETE envoie une exception MethodNotAllowedHttpException

J'écris une API webservice (dans laravel 4.2).
Pour une raison quelconque, le routage vers l'un de mes contrôleurs échoue de manière sélective en fonction de la méthode HTTP.

Mon routes.php ressemble à:

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

Ainsi, lorsque j’essaie l’une des méthodes GET/POST/PUT/PATCH/DELETE pour la
project.dev/v2/foo ou project.dev/v2/foo/1234 urls, tout fonctionne parfaitement.

Mais, pour une raison quelconque, seuls GET et POST fonctionnent pour project.dev/v2/foo/1234/bar. Les autres méthodes jettent simplement un 405 (MethodNotAllowedHttpException).
(fyi, j'émets des demandes via l'extension Advanced Rest Client Chrome.)

Que se passe-t-il?
Qu'est-ce que je rate?

11
mOrloff

Résolu!
La réponse peut être trouvée en exécutant php artisan routes.

Cela m'a montré que DELETE et PUT/PATCH attendent un identifiant de barre.
J'ai négligé cela car il ne peut y avoir qu'un seul de ce type particulier de "barre". La solution facile consiste simplement à l'ajouter à mon URL, peu importe, comme project.dev/v2/foo/1234/bar/5678.

18
mOrloff

Pour ceux qui utilisent les versions de Laravel> 4.2, utilisez ceci: 

php artisan route:list

Cela vous donnera la liste des routes définies dans votre application. Vérifiez si les itinéraires pour PUT et DELETE sont autorisés dans vos itinéraires ou non . 405 erreur est principalement parce qu'il n'y a pas d'itinéraire pour ces méthodes.

6
stackMonk

Je ne connais pas les anciennes versions Laravel. Mais j'utilise Laravel depuis 5.2 et il est nécessaire d'inclure une méthode cachée lors de l'utilisation de put, patch ou delete.

Ex:

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

Vérifiez https://laravel.com/docs/5.6/routing#form-method-spoofing

0
guizo