web-dev-qa-db-ja.com

Laravel:Route :: resource()GET&POST work、but PUT&DELETE throw MethodNotAllowedHttpException

WebサービスAPIを作成しています(laravel 4.2))。
何らかの理由で、私のコントローラーの1つへのルーティングがHTTPメソッドに基づいて選択的に失敗しています。

私のroutes.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)をスローするだけです。
(fyi、私はAdvanced Rest Client Chrome extension。)を介してリクエストを発行しています。)

どうしたの?
何が欠けていますか?

13
mOrloff

解決しました!
php artisan routesを実行すると、答えを見つけることができます。

これは、DELETEとPUT/PATCHがバーIDを期待(要求)することを示しました。
この特定のタイプの「バー」は1つしか存在できないため、たまたまそれを無視しています。 project.dev/v2/foo/1234/bar/5678のように、URLに関係なく単に追加するだけで簡単に修正できます。

18
mOrloff

Laravelバージョン> 4.2を使用している人は、これを使用してください:

php artisan route:list

これにより、アプリケーションに設定されたルートのリストが表示されます。 PUTおよびDELETEのルートがルートで許可されているかどうかを確認します。 405エラーの主な原因は、これらのメソッドにルートがないためです。

3
stackMonk

古いLaravelバージョンについてはわかりません。5.2からLaravelを使用しており、put、patch、または削除。

例:

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

チェック https://laravel.com/docs/5.6/routing#form-method-spoofing

1
guizo

非表示の入力フィールドをフォームに追加するだけです

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

そして、フォームメソッドをポストとして保持します

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

送信フォームでメソッドPUTを使用したい場合は、このリンクを表示する必要があります https://laravel.com/docs/5.6/routing#form-method-spoofing しかし、次のようなことをするためにマストをプロジェクトします。

<form>
@method('PUT')
// your_element

スクリプトに追加:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

$.ajax({
  url: {{ route('your_route', ':id') }},
  type: 'POST',
  data: data,
  dataType: 'json',
  cache: false,
}).done(function(data,status){
    // anything
}).fail(function(){
   // anythig

});