laravel melempar MethodNotAllowedHttpException


110

Saya mencoba menjalankan sesuatu yang sangat mendasar. Saya sudah terbiasa dengan CI dan sekarang mempelajari Laravel 4, dan dokumen mereka tidak membuatnya mudah! Bagaimanapun, saya mencoba membuat formulir login dan hanya memastikan bahwa data berhasil dikirim dengan mencetaknya di formulir berikutnya. Saya mendapatkan pengecualian ini:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

dan MemberController.php saya:

    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');
        }
    }

dan rute memiliki:

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

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

dan akhirnya tampilan saya login.php memiliki arah bentuk ini:

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

Bantuan apa pun akan sangat dihargai.


Di mana urlAnda mendapatkan kesalahan?
devo

Apakah Anda mencoba php artisan dump-autoload?
Andreyco

Pos lama tetapi orang masih tidak sengaja menemukannya - coba "komposer dump-autoload". Bekerja untuk saya.
kirgy

@Andreyco Perintah ini tidak ditentukan.
Marcelo Agimóvel

Jawaban:


198

Anda mendapatkan kesalahan itu karena Anda memposting ke GET rute.

Saya akan membagi rute Anda validatemenjadi rute GETdan terpisah POST.

Rute Baru:

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

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

Maka metode pengontrol Anda bisa saja

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

25

Kecurigaan saya adalah masalahnya terletak pada definisi rute Anda.

Anda mendefinisikan rute sebagai GETpermintaan tetapi formulir tersebut mungkin mengirimkan POSTpermintaan. Ubah definisi rute Anda.

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

Biasanya praktik yang lebih baik untuk menggunakan rute bernama (membantu menskalakan jika metode pengontrol / kelas berubah).

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

Dalam formulir gunakan yang berikut ini

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

23

Masalahnya adalah Anda menggunakan POSTtetapi sebenarnya Anda harus melakukan PATCH untuk memperbaiki add ini

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

Tepat setelah Form::modelantrean


1
di Laravel, Anda dapat menggunakan {{ method_field('PATCH') }}template Anda.
Michael Yousrie

13

Itu karena Anda memposting data melalui metode get.

Dari pada

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

Coba ini

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

Ini benar, dapatkah moderator menjadikan ini jawaban yang benar jika pengguna tidak mau? Ini adalah jawaban ke-3 dan ini satu-satunya jawaban yang benar.
logos_164

12

Saya mengalami masalah ini juga dan jawaban lain di sini yang membantu, tapi saya menggunakan Route::resourceyang mengurus GET, POSTdan permintaan lainnya.

Dalam kasus saya, saya meninggalkan rute saya sebagaimana adanya:

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

Dan cukup mengubah formulir saya untuk dikirim ke storefungsi di sayaFilesController

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

Ini memperbaiki masalah, dan saya pikir itu layak untuk ditunjukkan sebagai jawaban terpisah karena berbagai jawaban lain menyarankan untuk menambahkan POSTrute baru . Ini adalah opsi tetapi tidak perlu.


9

Biasanya MethodNotAllowedHttpExceptionterjadi saat

metode rute tidak cocok.

Misalkan Anda menentukan POSTfile rute permintaan, tetapi Anda mengirim GETpermintaan ke rute tersebut.


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

secara default, Form::open()mengasumsikan POSTmetode.

yang Anda miliki GETdi rute Anda. ubah menjadiPOST dalam rute yang sesuai.

atau jika Anda ingin menggunakan GETmetode ini, tambahkanmethod parameter.

misalnya

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

4

Saya menghadapi kesalahan,
masalahnya adalah METODE FORMULIR

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

Seharusnya seperti ini

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

4

Dalam kasus saya, saya mengirim POSTpermintaan HTTPke server tempat saya telah mengatur Nginxuntuk mengarahkan semua permintaan ke port 80ke port 443tempat saya melayani aplikasi HTTPS.

Membuat permintaan ke port yang benar secara langsung memperbaiki masalah. Dalam kasus saya, yang harus saya lakukan adalah mengganti http://URL permintaan https://karena saya menggunakan port default 80dan 443masing - masing.


Inilah masalah yang saya hadapi dan jawaban ini terbukti menjadi solusinya. Terima kasih
Oluwatobi Samuel Omisakin

3

Umumnya, ada kesalahan pada kata kerja HTTP yang digunakan misalnya:

PUTRute panggilan dengan POSTpermintaan


2

Masalah saya bukanlah karena rute saya salah, tetapi saya merujuk ke Formmetode yang salah (yang telah saya salin dari bentuk yang berbeda). Saya sedang melakukan...

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

(tanpa model yang ditentukan). Tetapi saya seharusnya menggunakan openmetode biasa ...

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

Karena parameter pertama modelmengharapkan model aktual, itu tidak mendapatkan salah satu opsi saya yang saya tentukan. Semoga ini bisa membantu seseorang yang tahu rutenya benar, tetapi ada hal lain yang salah.


2

Saya juga mengalami kesalahan yang sama tetapi memiliki perbaikan yang berbeda, saya XYZ.blade.phpmemiliki:

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

yang memberi saya kesalahan, - Saya masih tidak tahu mengapa- tetapi ketika saya mengubahnya menjadi

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

Berhasil!

Saya pikir itu layak untuk dibagikan :)


0

Laravel terkadang tidak mendukung {!! Form::open(['url' => 'posts/store']) !!}karena alasan keamanan. Itulah mengapa kesalahan terjadi. Anda dapat mengatasi kesalahan ini hanya dengan mengganti kode di bawah ini

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




Kode Kesalahan Kode Yang {!! Form::open(['url' => 'posts/store']) !!}

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


0

Dalam kasus saya, itu karena formulir saya dikirim ke rute dengan middleware yang berbeda. Jadi itu diblokir dari pengiriman informasi ke rute khusus ini.


0

baik ketika saya memiliki masalah ini saya menghadapi 2 kesalahan kode

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

saya mengoreksinya dengan melakukan ini

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

jadi hanya untuk mempercepat saya mengubah formulir modelmenjadiopen dan juga rute di mana salah ditempatkan di kurung siku.


-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 !');

Bisakah Anda menjelaskan sedikit tentang apa yang dilakukan kode ini dan bagaimana cara menyelesaikan masalah?
newUserName02
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.