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.


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

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

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


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

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.


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.


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

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

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.


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


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.


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


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


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.


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.


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

Você poderia explicar um pouco sobre o que esse código está fazendo e como ele resolve o problema?
newUserName02 de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.