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.

kunci spasi
sumber
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;
}
kuda tunggangan
sumber
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')); ?>
Berkat
sumber
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

Eli
sumber
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');
minitechi
sumber
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.

Dan
sumber
9

Biasanya MethodNotAllowedHttpExceptionterjadi saat

metode rute tidak cocok.

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

kousher alam pranto
sumber
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'))
itachi
sumber
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)) }}
Faruk Omar
sumber
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.

iSWORD
sumber
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

Slimane MEHARZI
sumber
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.

philthathril
sumber
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 :)

Ahmed Albarody
sumber
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')) !!}

Ariful Islam
sumber
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.

GabrielFiel
sumber
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.

Fillz Adebayo
sumber
-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 !');
Abdelhakim Ezzahraoui
sumber
Bisakah Anda menjelaskan sedikit tentang apa yang dilakukan kode ini dan bagaimana cara menyelesaikan masalah?
newUserName02