laravel throwing MethodNotAllowedHttpException

110

Estou tentando fazer algo muito básico funcionar. Estou acostumado com CI e agora aprendendo Laravel 4, e seus documentos não estão facilitando! De qualquer forma, estou tentando criar um formulário de login e apenas garantir que os dados sejam postados com sucesso imprimindo-o no próximo formulário. Estou recebendo esta exceção:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

e meu 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 as rotas tem:

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

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

e, finalmente, minha visão login.php tem esta direção de formulário:

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

Qualquer ajuda será muito apreciada.

chave espacial
fonte
Em que urlvocê está recebendo o erro?
devo
Você já tentou php artisan dump-autoload?
Andreyco
Postagem antiga, mas as pessoas ainda tropeçam nela - tente "composer dump-autoload". Funcionou para mim.
kirgy
@Andreyco este comando não está definido.
Marcelo Agimóvel 02/11/17

Respostas:

198

Você está recebendo esse erro porque está postando em uma GETrota.

Gostaria de dividir o seu encaminhamento para validateem um separado GETe POSTrotas.

Novas rotas:

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

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

Então, seu método de controle pode ser apenas

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

Minha suspeita é que o problema está na definição de sua rota.

Você definiu a rota como uma GETsolicitação, mas o formulário provavelmente está enviando uma POSTsolicitação. Mude sua definição de rota.

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

Geralmente é uma prática melhor usar rotas nomeadas (ajuda a escalar se o método / classe do controlador mudar).

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

No formulário, use o seguinte

<?php echo Form::open(array('route' => 'validate')); ?>
Bênção
fonte
23

O problema é o que você está usando, POSTmas na verdade você precisa executar PATCH Para corrigir este add

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

Logo depois da Form::modellinha

Eli
fonte
1
no Laravel você pode usar {{ method_field('PATCH') }}em seu template.
Michael Yousrie
13

Isso ocorre porque você está postando dados por meio de um método get.

Ao invés de

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

Tente isto

Route::post('/validate', 'MemberController@validateCredentials');
minitechi
fonte
Isso está correto. Um moderador pode dar a resposta correta se o usuário não o fizer? Esta é a terceira resposta para baixo e é a única que está certa.
logos_164
12

Eu encontrei este problema tão bem e as outras respostas aqui foram úteis, mas eu estou usando um Route::resourceque cuida de GET, POSTe outras solicitações.

No meu caso, deixei minha rota como está:

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

E simplesmente modifiquei meu formulário para submeter à storefunção em meuFilesController

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

Isso corrigiu o problema e achei que valia a pena apontar como uma resposta separada, já que várias outras respostas sugerem a adição de uma nova POSTrota. Esta é uma opção, mas não é necessária.

Dan
fonte
9

Normalmente MethodNotAllowedHttpExceptionacontece quando

método de rota não corresponde.

Suponha que você defina o POSTarquivo de rota de solicitação, mas está enviando uma GETsolicitação para a rota.

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

por padrão, Form::open()assume um POSTmétodo.

você tem GETem suas rotas. altere-o para POSTna rota correspondente.

ou se você quiser usar o GETmétodo, adicione o methodparâmetro.

por exemplo

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

Encontrei o erro, o
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)) }}

Deveria ser assim

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

No meu caso, eu estava enviando uma POSTsolicitação HTTPpara um servidor onde havia configurado Nginxpara redirecionar todas as solicitações de porta 80para porta 443onde eu estava servindo o aplicativo HTTPS.

Fazer a solicitação à porta correta corrigiu diretamente o problema. No meu caso, tudo o que tive que fazer foi substituir http://na URL de solicitação para, https://já que estava usando as portas padrão 80e 443respectivamente.

iSWORD
fonte
Este foi o problema que enfrentei e esta resposta provou ser a solução. Obrigado
Oluwatobi Samuel Omisakin
3

Geralmente, há um erro no verbo HTTP usado, por exemplo:

PUTRota de chamada com POSTpedido

Slimane MEHARZI
fonte
2

Meu problema não era que minhas rotas estavam configuradas incorretamente, mas que eu estava me referindo ao Formmétodo errado (que copiei de um formulário diferente). Eu estava fazendo...

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

(sem modelo especificado). Mas eu deveria estar usando o openmétodo normal ...

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

Porque o primeiro parâmetro para modelesperar um modelo real, ele não estava recebendo nenhuma das minhas opções que eu estava especificando. Espero que isso ajude alguém que sabe que suas rotas estão corretas, mas algo mais está errado.

philthathril
fonte
2

Eu também tive o mesmo erro, mas tive uma correção diferente, no meu XYZ.blade.php:

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

que me deu o erro - ainda não sei por quê - mas quando mudei para

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

Funcionou!

Achei que valia a pena compartilhar :)

Ahmed Albarody
fonte
0

Laravel às vezes não oferece suporte {!! Form::open(['url' => 'posts/store']) !!}por razões de segurança. É por isso que o erro aconteceu. Você pode resolver esse erro simplesmente substituindo o código abaixo

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




Código de Erro Código {!! Form::open(['url' => 'posts/store']) !!}

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

Islã Ariful
fonte
0

No meu caso, foi porque meu formulário estava enviando para uma rota com um middleware diferente. Portanto, ele bloqueou o envio de informações para esta rota específica.

GabrielFiel
fonte
0

bem, quando eu tive esses problemas, encontrei 2 erros de código

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

eu corrigi fazendo isso

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

então, apenas para explicar, mudei a forma modelpara opene também a rota onde foi colocada incorretamente entre colchetes.

Fillz Adebayo
fonte
-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
fonte
Você poderia explicar um pouco sobre o que esse código está fazendo e como ele resolve o problema?
newUserName02 de