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.


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

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

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


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

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.


9

In der Regel MethodNotAllowedHttpExceptionpassiert, wenn

Die Routenmethode stimmt nicht überein.

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


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

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

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.


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


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.


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


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


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.


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.


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

Könnten Sie bitte ein wenig erklären, was dieser Code tut und wie er das Problem löst?
newUserName02
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.