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.

spacemonkey
la source
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;
}
cheval à foin
la source
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')); ?>
Bénédiction
la source
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

Eli
la source
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');
minitechi
la source
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.

Dan
la source
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.

casher alam pranto
la source
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'))
Itachi
la source
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)) }}
Faruk Omar
la source
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.

iSWORD
la source
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

Slimane MEHARZI
la source
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.

philthathril
la source
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é :)

Ahmed Albarody
la source
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')) !!}

Islam Ariful
la source
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.

GabrielFiel
la source
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.

Fillz Adebayo
la source
-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
la source
Pourriez-vous s'il vous plaît expliquer un peu ce que fait ce code et comment il résout le problème?
newUserName02