laravel che lancia MethodNotAllowedHttpException


110

Sto cercando di far funzionare qualcosa di molto semplice. Sono abituato a CI e ora sto imparando Laravel 4, ei loro documenti non lo rendono facile! Ad ogni modo, sto cercando di creare un modulo di accesso e mi assicuro solo che i dati vengano pubblicati correttamente stampandoli nel modulo successivo. Ricevo questa eccezione:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

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

e percorsi ha:

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

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

e infine la mia vista login.php ha questa direzione del modulo:

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

Qualsiasi aiuto sarà molto apprezzato.


In quale urlviene visualizzato l'errore?
devo

Hai provato php artisan dump-autoload?
Andreyco

Vecchio post, ma la gente ancora inciampa in esso - prova "composer dump-autoload". Ha funzionato per me.
kirgy

@Andreyco questo comando non è definito.
Marcelo Agimóvel

Risposte:


198

Ricevi quell'errore perché stai scrivendo su una GETrotta.

Vorrei dividere il routing per validatein una separata GETe POSTpercorsi.

Nuove rotte:

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

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

Quindi il metodo del controller potrebbe essere solo

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

25

Il mio sospetto è che il problema risieda nella definizione del percorso.

Hai definito il percorso come una GETrichiesta, ma il modulo probabilmente sta inviando una POSTrichiesta. Modifica la definizione del percorso.

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

È generalmente una pratica migliore usare route denominate (aiuta a scalare se il metodo / classe del controller cambia).

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

Nel modulo utilizzare quanto segue

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

23

Il problema è che stai usando, POSTma in realtà devi eseguire PATCH Per risolvere questo problema

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

Subito dopo la Form::modellinea


1
in Laravel puoi usare {{ method_field('PATCH') }}nel tuo modello.
Michael Yousrie

13

Questo perché stai inviando dati tramite un metodo get.

Invece di

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

Prova questo

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

Questo è corretto, un moderatore può rendere questa la risposta corretta se l'utente non ha intenzione di farlo? Questa è la terza risposta in basso ed è l'unica corretta.
logos_164

12

Ho riscontrato anche questo problema e le altre risposte qui sono state utili, ma sto usando un file Route::resource che si prende cura di GET, POSTe altre richieste.

Nel mio caso ho lasciato il mio percorso così com'è:

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

E ho semplicemente modificato il mio modulo per sottometterlo alla storefunzione nel mioFilesController

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

Questo ha risolto il problema e ho pensato che valesse la pena sottolineare come risposta separata poiché varie altre risposte suggeriscono di aggiungere un nuovo POSTpercorso. Questa è un'opzione ma non è necessaria.


9

Di solito MethodNotAllowedHttpExceptionaccade quando

il metodo del percorso non corrisponde.

Supponiamo di definire il POSTfile di route della richiesta, ma di inviare la GETrichiesta alla route.


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

per impostazione predefinita, Form::open()assume un POSTmetodo.

hai GETnei tuoi percorsi. cambiarlo in POSTnel percorso corrispondente.

o se vuoi usare il GETmetodo, aggiungi il methodparametro.

per esempio

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

4

Ho riscontrato l'errore, il
problema era FORM METHOD

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

Dovrebbe essere così

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

4

Nel mio caso, stavo inviando una POSTrichiesta HTTPa un server in cui avevo impostato Nginxper reindirizzare tutte le richieste alla porta 80su 443cui stavo servendo l'app HTTPS.

Effettuare la richiesta alla porta corretta ha risolto direttamente il problema. Nel mio caso, tutto quello che dovevo fare era sostituire http://nell'URL della richiesta https://poiché stavo usando le porte predefinite 80e 443rispettivamente.


Questo è stato il problema che ho dovuto affrontare e questa risposta si è rivelata la soluzione. Grazie
Oluwatobi Samuel Omisakin

3

In generale, c'è un errore nel verbo HTTP utilizzato, ad esempio:

Chiamata PUTrotta con POSTrichiesta


2

Il mio problema non era che i miei percorsi fossero stati impostati in modo errato, ma che stavo facendo riferimento al Formmetodo sbagliato (che avevo copiato da una forma diversa). Stavo facendo...

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

(senza modello specificato). Ma avrei dovuto usare il openmetodo normale ...

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

Poiché il primo parametro per modelaspettarsi un modello reale, non stava ottenendo nessuna delle mie opzioni che stavo specificando. Spero che questo aiuti qualcuno che sa che le loro rotte sono corrette, ma qualcos'altro non va.


2

Ho anche avuto lo stesso errore ma ho avuto una correzione diversa, nel mio XYZ.blade.phpavevo:

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

che mi ha dato l'errore, - ancora non so perché - ma quando l'ho cambiato in

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

Ha funzionato!

Ho pensato che valesse la pena condividerlo :)


0

Laravel a volte non supporta {!! Form::open(['url' => 'posts/store']) !!}per motivi di sicurezza. Ecco perché si è verificato l'errore. Puoi risolvere questo errore semplicemente sostituendo il codice seguente

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




Codice di errore Codice {!! Form::open(['url' => 'posts/store']) !!}

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


0

Nel mio caso, era perché il mio modulo stava inviando a una route con un middleware diverso. Quindi ha bloccato l'invio di informazioni a questo percorso specifico.


0

bene quando ho avuto questi problemi ho dovuto affrontare 2 errori di codice

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

l'ho corretto in questo modo

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

quindi solo per espatriare ho cambiato la forma modelin opene anche il percorso era posizionato erroneamente tra parentesi quadre.


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

Potresti spiegare un po 'cosa sta facendo questo codice e come risolve il problema?
newUserName02
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.