laravelによるMethodNotAllowedHttpExceptionのスロー


110

私は非常に基本的なものを実行しようとしています。私はCIに慣れており、Laravel 4を習得しています。彼らのドキュメントは簡単ではありません!とにかく、私はログインフォームを作成し、次のフォームにデータを印刷して、データが正しく投稿されることを確認しようとしています。私はこの例外を受けています:

symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

そして私のMemberController.php:

    public function index()
    {
        if (Session::has('userToken'))
        {
            /*Retrieve data of user from DB using token & Load view*/
            return View::make('members/profile');
        }else{
            return View::make('members/login');
        }
    }

    public function validateCredentials()
    {
        if(Input::post())
        {
            $email = Input::post('email');
            $password = Input::post('password');
            return "Email: " . $email . " and Password: " . $password;
        }else{
            return View::make('members/login');
        }
    }

とルートがあります:

Route::get('/', function()
{
    return View::make('hello');
});

Route::get('/members', 'MemberController@index');
Route::get('/validate', 'MemberController@validateCredentials');

最後に、私のビューlogin.phpには、次のフォーム方向があります。

<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>

どんな助けでも大歓迎です。


これでurlあなたは、エラーを取得していますか?
2013年

試しましたphp artisan dump-autoloadか?
Andreyco 2013年

古い投稿ですが、人々はまだそれに遭遇しています-「composer dump-autoload」を試してください。私のために働いた。
カーギー

@Andreycoこのコマンドは定義されていません。
MarceloAgimóvel17年

回答:


198

GETルートに投稿しているため、このエラーが発生しています。

私はあなたのためのルーティングを分割するだろうvalidate、別の中へGETPOST路線。

新しいルート:

Route::post('validate', 'MemberController@validateCredentials');

Route::get('validate', function () {
    return View::make('members/login');
});

次に、あなたのコントローラメソッドは

public function validateCredentials()
{
    $email = Input::post('email');
    $password = Input::post('password');
    return "Email: " . $email . " and Password: " . $password;
}

25

ルートの定義に問題があるのではないかと疑っています。

ルートをGETリクエストとして定義しましたが、フォームがPOSTリクエストを送信している可能性があります。ルート定義を変更します。

Route::post('/validate', 'MemberController@validateCredentials');

一般に、名前付きルートを使用することをお勧めします(コントローラーのメソッド/クラスが変更された場合のスケーリングに役立ちます)。

Route::post('/validate', array(
    'as' => 'validate',
    'uses' => 'MemberController@validateCredentials'
));

フォームでは以下を使用します

<?php echo Form::open(array('route' => 'validate')); ?>

23

問題はあなたが使用していることですがPOST、実際には実行PATCH する必要がありますこの追加を修正するには

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

Form::model行の直後


1
Laravel {{ method_field('PATCH') }}では、テンプレートで使用できます。
Michael Yousrie 2017

13

これは、getメソッドを使用してデータを投稿しているためです。

の代わりに

Route::get('/validate', 'MemberController@validateCredentials');

これを試して

Route::post('/validate', 'MemberController@validateCredentials');

これは正しいです。ユーザーが行かない場合、モデレーターはこれを正しい答えにすることができますか?これが3番目の答えです。正しいのはこれだけです。
logos_164

12

私もこの問題が発生したため、他の回答ここでは有用だったが、私は使用していますRoute::resourceの世話をしているGETPOSTと、他の要求を。

私の場合、私はルートをそのまま残しました:

Route::resource('file', 'FilesController');

そして、単純に私のフォームを変更してstoreFilesController

{{ Form::open(array('route' => 'file.store')) }}

これで問題が解決しましたPOST。他のさまざまな回答が新しいルートの追加を提案しているため、別の回答として指摘する価値があると思いました。これはオプションですが、必須ではありません。


9

通常MethodNotAllowedHttpException

ルート方法が一致しません。

POSTリクエストルートファイルを定義GETし、ルートにリクエストを送信するとします。


7
<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>

デフォルトでForm::open()は、POSTメソッドを想定しています。

あなたは持っているGETあなたのルートに。POST対応するルートで変更してください。

または、GETメソッドを使用する場合は、methodparamを追加します。

例えば

Form::open(array('url' => 'foo/bar', 'method' => 'get'))

4

エラーに直面しました、
問題はフォームメソッドでした

{{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'PUT','files'=>true)) }}

こんな感じ

{{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'POST','files'=>true)) }}

4

私の場合、すべてのリクエストを、アプリを提供しているポートに転送するように設定したサーバーにPOSTリクエストを送信しHTTPていました。Nginx80443HTTPS

正しいポートにリクエストを送信すると、問題が直接修正されました。私の場合、私がしなければならなかったのは、デフォルトのポートをそれぞれ使用http://していたhttps://ので、リクエストURLを置き換えるだけです。80443


これが私が直面した問題であり、この答えが解決策であることが判明しました。ありがとう
Oluwatobi Samuel Omisakin


2

私の問題は、ルートが正しく設定されていないことではなく、間違ったFormメソッド(別のフォームからコピーしたもの)を参照していたことです。やっていた...

{!! Form::model([ ... ]) !!}

(モデルが指定されていません)。しかし、私は通常のopen方法を使用していたはずです...

{!! Form::open([ ... ]) !!}

最初のパラメーターmodelは実際のモデルを想定しているため、指定していたオプションを取得できませんでした。これが彼らのルートが正しいことを知っている誰かを助けることを願っていますが、他の何かが間違っています。


2

私も同じエラーがありましたが、私の修正は異なっXYZ.blade.phpていました:

{!! Form::open(array('ul' => 'services.store')) !!}

それは私にエラーを与えました-私はまだ理由がわかりません-しかし私がそれを

{!! Form::open(array('route' => 'services.store')) !!}

出来た!

共有する価値があると思いました:)


0

Laravelは{!! Form::open(['url' => 'posts/store']) !!}、セキュリティ上の理由からサポートしない場合があります。そのため、エラーが発生しました。以下のコードを置き換えるだけでこのエラーを解決できます

{!! Form::open(array('route' => 'posts.store')) !!}




エラーコード{!! Form::open(['url' => 'posts/store']) !!}

正しいコード{!! Form::open(array('route' => 'posts.store')) !!}


0

私の場合は、フォームが別のミドルウェアのルートに送信されていたためです。そのため、この特定のルートへの情報の送信がブロックされました。


0

これらの問題があったとき、私は2つのコードエラーに直面しました

{!! Form::model(['method' => 'POST','route' => ['message.store']]) !!}

これを実行して修正しました

{!! Form::open(['method' => 'POST','route' => 'message.store']) !!}

ですから、説明を簡単にするために、形modelを変更しましたopen。また、角括弧に間違って配置されたルートも変更しました。


-1
// not done
Route::post('`/posts/{id}`', 'PostsController@store')->name('posts.store');

return redirect('`/posts'`)->with('status','Post was created !');

// done
Route::post('`/posts`', 'PostsController@store')->name('posts.store');

return redirect('`/posts'`)->with('status','Post was created !');

このコードが何をしていて、どのように問題を解決するのかについて少し説明していただけませんか?
newUserName02
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.