Laravel lançant MethodNotAllowedHttpException


110

J'essaie de faire fonctionner quelque chose de très basique. Je suis habitué à CI et j'apprends maintenant Laravel 4, et leurs documents ne me facilitent pas la tâche! Quoi qu'il en soit, j'essaie de créer un formulaire de connexion et de m'assurer simplement que les données sont publiées avec succès en les imprimant dans le formulaire suivant. Je reçois cette exception:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

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

et les routes ont:

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

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

et enfin ma vue login.php a cette direction de formulaire:

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

Toute aide sera fortement appréciée.


Dans lequel urlvous obtenez l'erreur?
devo

Avez-vous essayé php artisan dump-autoload?
Andreyco

Ancien message mais les gens trébuchent toujours dessus - essayez "composer dump-autoload". A travaillé pour moi.
kirgy

@Andreyco cette commande n'est pas définie.
Marcelo Agimóvel

Réponses:


198

Vous obtenez cette erreur parce que vous publiez sur un GETitinéraire.

Je diviserais votre itinéraire pour validateen un GETet des POSTitinéraires séparés .

Nouveaux itinéraires:

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

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

Ensuite, votre méthode de contrôleur pourrait simplement être

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

25

Je soupçonne que le problème réside dans la définition de votre itinéraire.

Vous avez défini l'itinéraire comme une GETdemande mais le formulaire envoie probablement une POSTdemande. Modifiez la définition de votre itinéraire.

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

Il est généralement préférable d'utiliser des routes nommées (aide à évoluer si la méthode / classe du contrôleur change).

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

Dans le formulaire, utilisez ce qui suit

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

23

Le problème est que vous utilisez POSTmais en fait vous devez effectuer PATCH Pour résoudre ce problème, ajoutez

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

Juste après la Form::modelligne


1
dans Laravel, vous pouvez utiliser {{ method_field('PATCH') }}dans votre modèle.
Michael Yousrie

13

C'est parce que vous publiez des données via une méthode get.

Au lieu de

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

Essaye ça

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

C'est correct, un modérateur peut-il en faire la bonne réponse si l'utilisateur ne le fait pas? C'est la troisième réponse et c'est la seule qui a raison.
logos_164

12

J'ai rencontré ce problème aussi bien et les autres réponses ici ont été utiles, mais je me sers d' un Route::resourcequi prend en charge GET, POSTet d' autres demandes.

Dans mon cas, j'ai laissé mon itinéraire tel quel:

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

Et simplement modifié mon formulaire pour le soumettre à la storefonction dans monFilesController

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

Cela a résolu le problème, et j'ai pensé qu'il valait la peine de le signaler comme une réponse distincte, car diverses autres réponses suggèrent d'ajouter une nouvelle POSTroute. C'est une option mais ce n'est pas nécessaire.


9

Cela MethodNotAllowedHttpExceptionse produit généralement lorsque

La méthode d'itinéraire ne correspond pas.

Supposons que vous définissiez le POSTfichier d'itinéraire de demande, mais que vous envoyiez une GETdemande à l'itinéraire.


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

par défaut, Form::open()suppose une POSTméthode.

vous avez GETdans vos itinéraires. changez-le en POSTdans l'itinéraire correspondant.

ou si vous souhaitez utiliser la GETméthode, ajoutez le methodparamètre.

par exemple

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

4

J'ai fait face à l'erreur, le
problème était FORM METHOD

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

Ça devrait être comme ça

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

4

Dans mon cas, j'envoyais une POSTdemande HTTPà un serveur sur lequel j'avais configuré Nginxpour rediriger toutes les demandes de port 80à port sur 443lequel je servais l'application HTTPS.

Faire la demande au bon port a directement résolu le problème. Dans mon cas, tout ce que j'avais à faire est de remplacer http://dans l'URL de la requête à https://puisque j'utilisais les ports par défaut 80et 443respectivement.


C'était le problème auquel je faisais face et cette réponse s'est avérée être la solution. Merci
Oluwatobi Samuel Omisakin

3

Généralement, il y a une erreur dans le verbe HTTP utilisé, par exemple:

PUTItinéraire d' appel avec POSTdemande


2

Mon problème n'était pas que mes itinéraires étaient mal configurés, mais que je référençais la mauvaise Formméthode (que j'avais copiée à partir d'un autre formulaire). Je faisais...

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

(sans modèle spécifié). Mais j'aurais dû utiliser la openméthode habituelle ...

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

Parce que le premier paramètre à modelattendre un modèle réel, il n'obtenait aucune de mes options que je spécifiais. J'espère que cela aide quelqu'un qui sait que ses itinéraires sont corrects, mais quelque chose ne va pas.


2

J'ai également eu la même erreur mais j'ai eu une solution différente, dans mon XYZ.blade.phpj'avais:

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

ce qui m'a donné l'erreur, - je ne sais toujours pas pourquoi - mais quand je l'ai changé en

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

Ça a marché!

J'ai pensé que ça valait le coup d'être partagé :)


0

Laravel ne prend parfois pas en charge {!! Form::open(['url' => 'posts/store']) !!}pour des raisons de sécurité. C'est pourquoi l'erreur s'est produite. Vous pouvez résoudre cette erreur en remplaçant simplement le code ci-dessous

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




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

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


0

Dans mon cas, c'était parce que mon formulaire envoyait vers une route avec un middleware différent. Il a donc bloqué l'envoi d'informations sur cette route spécifique.


0

bien quand j'ai eu ces problèmes, j'ai rencontré 2 erreurs de code

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

je l'ai corrigé en faisant ça

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

si juste pour épiloguer j'ai changé la forme modelde openet aussi la voie où mal placée dans des crochets.


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

Pourriez-vous s'il vous plaît expliquer un peu ce que fait ce code et comment il résout le problème?
newUserName02
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.