Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

16
respostas

The PUT method is not supported for this route. Supported methods: POST.

Prezados estou utilizando o mesmo formulário para criação e editar os dados . O Formulario de Criação funciona normalmente para gravar , mas quando vou alterar apresenta a mensagem citada acima e não consigo validar os campos com o mesmo FormRequest de criação ? .Estou usando um if para form alterar e criar.

@if(isset($processos)) 
    <form method="POST" action="{{route('processos.update')}}">

    @method('PUT')

    @else  
    <form method="post" action="{{route('processos.store')}}">
    @endif



          @csrf   
 public function update(ProcIntenoFormRequest $request)
    {

        echo "ESTOU AQUII";
        echo"<pre>";
        print($request);
    }
Route::get('processos/gravar','ProcInternoController@create')->name('form_gravar_processos');
Route::post('/processos/editar','ProcInternoController@edit')->name('form_editar_processos');
Route::post('processos/alterar','ProcInternoController@update')->name('processos.update');
16 respostas

Você criou a rota como post (Route::post) e está tentando enviar a requisição como PUT. Por isso não funciona. :-)

Então Vinicius deixa eu ser mais claro,pois ainda está dando erro. O meu formulário de criação e de edição são os mesmo certo ?

Para validar os campos também na alteração criei um novo formRequest certo ?? ou tenho que validar de outra maneira no UPDATE?

E quando clico no botão alterar não passa pela validação do FormRequest que eu criei e apresenta o seguinte erro : The GET method is not supported for this route. Supported methods: POST.

public function update(ProcInternoAlteraFormRequest $request, $id) {

    echo "ESTOU AQUII";
    echo"<pre>";
    print($request);
}
insira seu código aqui

Seu problema é essa linha:

Route::post('processos/alterar','ProcInternoController@update')->name('processos.update');

Troque por:

Route::put('/processos/alterar', 'ProcInternoController@update')->name('processos.update');

O erro que você está citando não tem nenhuma relação com a classe de Request criada.

:-)

Então Vinícius Muito obrigado pela ajuda , mas continua não validando o formulário de edição e olha que fiz do jeito que falou . Apresenta os seguintes erros :

The GET method is not supported for this route. Supported methods: POST. Illuminate\Routing\RouteCollection::methodNotAllowed :256 vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php:256

Eu Inspecionei o elemento do meu formulário e está reconhecendo o method PUT e também já fiz a alteração da minha rota.

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

 <input type="hidden" name="_token" value="JecNrLo7KliNFDRCukxd7YxegyJXhZtNh2teIo3z">   
public function update(ProcIntenoFormRequest $request, $id) 
{
    //print_r($_POST);   
    //echo "ESTOU AQUII";

}
Route::put('/processos/alterar/{$id}', 'ProcInternoController@update')->name('processos.update');

Vinícius vc pode me ajudar ainda ??Lembrando que sem o formRequest o UPDATE funciona normalmente

Fala, Rafael! Desculpa a demora. Esse post acabou se perdendo aqui.

Você consegue colocar seu código completo no github ou algum outro lugar onde eu possa testar?

SEGUE O PROJETO https://github.com/rafaeldenis/cja?files=1

O Form request funciona normalmente na inclusão , mas no UPDATE não e já fiz a rota de update como PUT

Rafael, eu ainda não rodei o proejto aqui, mas no seu código você tem um problema:

No parâmetro você tá esperando uma instância de ProcInternoFormRequest mas sua classe se chama ProcIntenoFormRequest. Está escrito errado, entende? Falta um r ali. rs

Corrige aí rapidinho e vê se resolve, enquanto eu vou subindo o ambiente aqui na minha máquina.

Aparentemente vc tá usando Oracle como banco e não colocou nenhum Dockerfile no GitHub, então fica difícil pra eu subir o ambiente rápido aqui. =/

Mas, tá aqui o erro, aparentemente: https://imgur.com/a/Dg3w5aA

Print

Então Vinicius contniua dando erro mesmo acertando o R . ERRO :Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException No Metodo store faz a validação no formulário e no update não que estranho. Abaixo meu formulário quando é alteração coloquei @method('PUT') e a minha rota de update

Route::put('/processos/alterar/{id}', 'ProcInternoController@update')->name('processos.update');
@if(isset($processos)) 
    <form method="POST" action="{{route('processos.update')}}">

    @method('PUT')

    @else  
    <form method="post" action="{{route('processos.store')}}">
    @endif

Você consegue subir um docker-compose.yml ou só um Dockerfile com o ambiente necessário pra eu testar aqui? Como você tá usando Oracle, fica difícil pra eu montar o ambiente pra testar.

Infelizmente ainda não tenho conhecimento no Docker garoto

Rafael, a menos que tenha algum javascript te redirecionando quando você faz o submit do formulário, eu realmente não estou entendendo o motivo pra você estar recebendo esse erro.

=/

Dá uma olhada nos logs do Laravel. Vê se você tá sendo direcionado pra rota correta.

Então meu garoto se eu tiro o FORM REQUEST e mando sem a validação faz a rotina de UPDATE normal , só não entra na validação.

Estou com uma suspeita , pois pesquisei e o programador com o mesmo problema do meu :

https://pt.stackoverflow.com/questions/352808/throw-new-methodnotallowedhttpexceptionothers-laravel-5-7-envio-de-formul%C3%A1ri

Ele fala que o jeito correto de passar a rota é dessa maneira ? Tá passando com um array os parametros vc viu ?

{!! Form::model($colaboration, array('route' => array('colaboradores.update', $colaboration->id))) !!} @method('PUT').

No meu código não estou utilizando o Form do blade será que pode ser isso ?

@if(isset($processos)) 
    <form  method="POST" action="{{route('processos.update', $processos[0]->numero_proc )}}">    

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

    @else  
    <form method="post" action="{{route('processos.store')}}"> 
    @endif     insira seu código aqui

Rafael, não custa tentar. Eu nunca esbarrei nesse erro, então tenta isso. Muda sua abertura de form pra usar a classe Form e vê se vai.