Laravel wirft MethodNotAllowedHttpException

110

Ich versuche, etwas sehr Grundlegendes zum Laufen zu bringen. Ich bin an CI gewöhnt und lerne jetzt Laravel 4, und ihre Dokumente machen es nicht einfach! Wie auch immer, ich versuche ein Anmeldeformular zu erstellen und stelle einfach sicher, dass die Daten erfolgreich gebucht werden, indem ich sie im nächsten Formular drucke. Ich bekomme diese Ausnahme:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

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

und Routen hat:

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

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

und schließlich hat meine Ansicht login.php diese Formularrichtung:

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

Jede Hilfe wird sehr geschätzt.

Raumschlüssel
quelle
In welcher urlbekommen Sie den Fehler?
Devo
Hast du es versucht php artisan dump-autoload?
Andreyco
Alter Beitrag, aber die Leute stolpern immer noch darüber - versuchen Sie "Composer Dump-Autoload". Hat für mich gearbeitet.
Kirgy
@Andreyco dieser Befehl ist nicht definiert.
Marcelo Agimóvel

Antworten:

198

Sie erhalten diesen Fehler, weil Sie auf einer GETRoute posten .

Ich würde Ihr Routing validatein separate GETund POSTRouten aufteilen .

Neue Routen:

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

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

Dann könnte Ihre Controller-Methode einfach sein

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

Mein Verdacht ist, dass das Problem in Ihrer Routendefinition liegt.

Sie haben die Route als GETAnfrage definiert, aber das Formular sendet wahrscheinlich eine POSTAnfrage. Ändern Sie Ihre Routendefinition.

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

Es ist im Allgemeinen besser, benannte Routen zu verwenden (hilft bei der Skalierung, wenn sich die Controller-Methode / Klasse ändert).

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

Verwenden Sie im Formular Folgendes

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

Das Problem ist das, das Sie verwenden, POSTaber tatsächlich müssen Sie ausführen, PATCH um dieses Add zu beheben

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

Gleich nach der Form::modelLeitung

Eli
quelle
1
In Laravel können Sie {{ method_field('PATCH') }}in Ihrer Vorlage verwenden.
Michael Yousrie
13

Dies liegt daran, dass Sie Daten über eine get-Methode veröffentlichen.

Anstatt

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

Versuche dies

Route::post('/validate', 'MemberController@validateCredentials');
Minitechi
quelle
Dies ist richtig. Kann ein Moderator dies zur richtigen Antwort machen, wenn der Benutzer dies nicht tut? Dies ist die dritte Antwort und es ist die einzige, die richtig ist.
Logos_164
12

Ich habe dieses Problem auch und die anderen Antworten hier waren hilfreich, aber ich bin mit Route::resourceder Pflege nimmt GET,POST und andere Anfragen.

In meinem Fall habe ich meine Route wie folgt verlassen:

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

Und einfach mein Formular geändert, um es an die storeFunktion in meinem zu sendenFilesController

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

Dies hat das Problem behoben, und ich dachte, es lohnt sich, darauf als separate Antwort hinzuweisen, da verschiedene andere Antworten das Hinzufügen einer neuen POSTRoute vorschlagen . Dies ist eine Option, aber nicht erforderlich.

Dan
quelle
9

In der Regel MethodNotAllowedHttpExceptionpassiert, wenn

Die Routenmethode stimmt nicht überein.

Angenommen, Sie definieren eine POSTAnforderungsroutendatei, senden jedoch eine GETAnforderung an die Route.

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

Standardmäßig wird Form::open()eine POSTMethode angenommen.

Sie haben GETin Ihren Routen. Ändern Sie es POSTin der entsprechenden Route.

oder wenn Sie die GETMethode verwenden möchten , fügen Sie den methodParameter hinzu.

z.B

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

Ich sah mich dem Fehler gegenüber, das
Problem war FORM METHOD

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

Es sollte so sein

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

In meinem Fall habe ich eine POSTAnfrage HTTPan einen Server gesendet, auf dem ich eingerichtet hatte Nginx, um alle Anfragen an Port 80zu Port umzuleiten, an 443dem ich die App bereitgestellt habe HTTPS.

Durch die direkte Anforderung an den richtigen Port wurde das Problem behoben. In meinem Fall hatte alles , was ich zu tun ist , ersetzen http://in der Anforderungs - URL zu , https://da ich die Standardports wurde mit 80und 443jeweils.

iSWORD
quelle
Dies war das Problem, mit dem ich konfrontiert war, und diese Antwort erwies sich als die Lösung. Vielen Dank
Oluwatobi Samuel Omisakin
3

Im Allgemeinen gibt es einen Fehler im verwendeten HTTP-Verb, z. B.:

Anrufroute PUTmit POSTAnfrage

Slimane MEHARZI
quelle
2

Mein Problem war nicht, dass meine Routen falsch eingerichtet waren, sondern dass ich auf die falsche FormMethode verwies (die ich aus einem anderen Formular kopiert hatte). Ich habe getan...

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

(ohne Modellangabe). Aber ich hätte die reguläre openMethode anwenden sollen ...

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

Da der erste Parameter modelein tatsächliches Modell erwartete, erhielt er keine meiner von mir angegebenen Optionen. Ich hoffe, dies hilft jemandem, der weiß, dass seine Routen korrekt sind, aber etwas anderes stimmt nicht.

Philthathril
quelle
2

Ich hatte auch den gleichen Fehler, aber eine andere Lösung, in der XYZ.blade.phpich hatte:

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

was mir den Fehler gab, - ich weiß immer noch nicht warum - aber als ich es geändert habe

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

Es funktionierte!

Ich dachte, es lohnt sich zu teilen :)

Ahmed Albarody
quelle
0

Laravel unterstützt manchmal {!! Form::open(['url' => 'posts/store']) !!}aus Sicherheitsgründen nicht. Deshalb ist der Fehler aufgetreten. Sie können diesen Fehler beheben, indem Sie einfach den folgenden Code ersetzen

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




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

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

Schöner Islam
quelle
0

In meinem Fall lag es daran, dass mein Formular an eine Route mit einer anderen Middleware gesendet wurde. Daher wurde das Senden von Informationen an diese bestimmte Route blockiert.

GabrielFiel
quelle
0

Nun, als ich dieses Problem hatte, hatte ich 2 Codefehler

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

Ich habe es dadurch korrigiert

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

so einfach expatiate i die Form geändert modelzu openund auch die Strecke , wo fälschlicherweise in eckigen Klammern gesetzt.

Fillz Adebayo
quelle
-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
quelle
Könnten Sie bitte ein wenig erklären, was dieser Code tut und wie er das Problem löst?
newUserName02