laravel fırlatma MethodNotAllowedHttpException


110

Çok basit bir şey çalıştırmaya çalışıyorum. CI'ye alıştım ve şimdi Laravel 4'ü öğreniyorum ve onların dokümanları bunu kolaylaştırmıyor! Her neyse, bir giriş formu oluşturmaya çalışıyorum ve sadece bir sonraki forma yazdırarak verilerin başarılı bir şekilde gönderildiğinden emin oluyorum. Bu istisnayı alıyorum:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

ve MemberController.php'im:

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

ve rotalar:

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

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

ve son olarak benim görünüm login.php şu form yönüne sahip:

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

Herhangi bir yardım çok takdir edilecektir.


Hangi urlhatayı alıyorsun?
devo

Denedin php artisan dump-autoloadmi
Andreyco

Eski gönderi ancak insanlar hala karşısına çıkıyor - "besteci dump-autoload" işlemini deneyin. Benim için çalıştı.
kirgy

@Andreyco bu komut tanımlı değil.
Marcelo Agimóvel

Yanıtlar:


198

Bu hatayı bir GETrotaya gönderdiğiniz için alıyorsunuz .

Rotanızı validateayrı GETve POSTrotalara ayırırdım.

Yeni Rotalar:

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

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

O zaman denetleyici yönteminiz sadece

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

25

Şüphem, sorunun rota tanımında yatması.

Rotayı bir GETistek olarak tanımladınız, ancak form muhtemelen bir POSTistek gönderiyor . Rota tanımınızı değiştirin.

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

Adlandırılmış yolları kullanmak genellikle daha iyi bir uygulamadır (denetleyici yöntemi / sınıfı değişirse ölçeklemeye yardımcı olur).

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

Formda aşağıdakileri kullanın

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

23

Sorun şu ki, kullanıyorsunuz POSTama aslında PATCH bu eklentiyi düzeltmek için yapmanız gerekiyor

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

Hemen sonra Form::modelhat


1
Laravel'de {{ method_field('PATCH') }}şablonunuzda kullanabilirsiniz .
Michael Yousrie

13

Bunun nedeni, verileri bir alma yöntemi aracılığıyla göndermenizdir.

Onun yerine

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

Bunu dene

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

Bu doğru, kullanıcı bunu yapmayacaksa moderatör bunu doğru cevap verebilir mi? Bu 3. cevap ve doğru olan tek cevap.
logos_164

12

Ben de bu sorunla karşılaştı ve diğer cevaplar burada yararlı, ama kullanıyorum Route::resourceilgilenir ki GET, POSTve diğer istekleri.

Benim durumumda rotamı olduğu gibi terk ettim:

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

Formumdaki storeişleve göndermek için basitçeFilesController

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

Bu sorunu çözdü ve diğer çeşitli yanıtlar yeni bir POSTrota eklemeyi önerdiğinden ayrı bir yanıt olarak belirtmeye değer olduğunu düşündüm . Bu bir seçenektir ancak gerekli değildir.


9

Genellikle MethodNotAllowedHttpExceptionne zaman olur?

rota yöntemi eşleşmiyor.

Diyelim ki POSTistek yol dosyası tanımladınız , ancak GETrotaya istek gönderiyorsunuz .


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

Varsayılan olarak, Form::open()bir varsayar POSTyöntemi.

Sahip GETrotanıza. olarak değiştirin POSTgelen rotada.

veya GETyöntemi kullanmak istiyorsanız , methodparam'ı ekleyin .

Örneğin

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

4

Hatayla karşılaştım,
sorun FORM METODU idi

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

Böyle olmalı

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

4

Benim durumumda, tüm istekleri uygulamayı üzerinden hizmet verdiğim bağlantı noktasına yeniden yönlendirmek için kurduğum bir sunucuya bir POSTistek gönderiyordum .HTTPNginx80443HTTPS

Doğru bağlantı noktasına talepte bulunmak sorunu doğrudan çözdü. Benim durumumda, varsayılan bağlantı noktalarını ve sırasıyla kullandığım için tek yapmam http://gereken istek URL'sini değiştirmek .https://80443


Karşılaştığım sorun buydu ve bu yanıtın çözüm olduğu ortaya çıktı. Teşekkürler
Oluwatobi Samuel Omisakin

3

Genellikle kullanılan HTTP fiilinde bir hata vardır, örneğin:

Talep PUTile arama rotasıPOST


2

Benim sorunum rotalarımın yanlış ayarlanmış olması değil, yanlış Formyönteme (farklı bir formdan kopyaladığım) referansta bulunmamdı . Yapıyordum...

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

(model belirtilmeden). Ama normal openyöntemi kullanmalıydım ...

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

Çünkü modelgerçek bir model bekleyen ilk parametre , belirttiğim seçeneklerimden hiçbirini almıyordu. Umarım bu, rotalarının doğru olduğunu bilen birine yardımcı olur, ancak başka bir şey yanlıştır.


2

Ben de aynı hatayı aldım ama farklı bir düzeltme yaptım, XYZ.blade.phpbende:

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

bu bana hatayı verdi, - hala nedenini bilmiyorum - ama bunu olarak değiştirdiğimde

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

İşe yaradı!

Paylaşmaya değer olduğunu düşündüm :)


0

Laravel bazen {!! Form::open(['url' => 'posts/store']) !!}güvenlik nedeniyle desteklemez . Hata olmasının nedeni budur. Aşağıdaki kodu değiştirerek bu hatayı çözebilirsiniz.

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




Hata Kodu {!! Form::open(['url' => 'posts/store']) !!}

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


0

Benim durumumda bunun nedeni formumun farklı bir ara katman yazılımına sahip bir rotaya göndermesiydi. Bu nedenle, bu belirli rotaya bilgi göndermesini engelledi.


0

Peki bu problemi yaşadığımda 2 kod hatasıyla karşılaştım

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

bunu yaparak düzelttim

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

Bu yüzden, sadece formu ve ayrıca köşeli parantez içine yanlış yerleştirilmiş rotayı açıklamak modeliçin değiştirdim 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 !');

Bu kodun ne yaptığını ve sorunu nasıl çözdüğünü biraz açıklar mısınız?
newUserName02
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.