3
respostas

Método não permitido

Opa, Estou enfrentando problemas para editar uma série. Ele redireciona para a URL correta, mas aponta que o método utilizado não está correto:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

form.blade.php

<form action="{{ $action }}" method="post">
    @csrf
    @isset($nome)
    @method('PUT')
    @endisset
    <div class="mb-3">
        <label for="nome" class="form-label">Nome:</label>
        <input type="text" id="nome" name="nome" class="form-control" @isset($nome)value="{{$serie->nome}}" @endisset>
    </div>

    <button type="submit" class="btn btn-primary">Adicionar</button>
</form>

web.php

Route::get('/', function () {
    return view('welcome');
});

Route::get('/series', [SeriesController::class, 'index'])->name('series.index');
Route::get('/series/criar', [SeriesController::class, 'create'])->name('series.create');
Route::post('/series/salvar', [SeriesController::class, 'store'])->name('series.store');
Route::delete('/series/destroy/{serie}', [SeriesController::class, 'destroy'])->name('series.destroy');
Route::get('/series/edit/{serie}', [SeriesController::class, 'edit'])->name('series.edit');
Route::put('/series/update/{serie}', [SeriesController::class, 'update'])->name('series.update');

SerieController.php

class SeriesController extends Controller
{
    public function index(Request $request)
    {
        $series = Serie::query()->orderBy('nome')->get();
        $mensagemSucesso = session('mensagem.sucesso');

        return view('series.index')->with('series', $series)->with('mensagem.sucesso', $mensagemSucesso);
    }

    public function create()
    {
        return view('series.create');
    }

    public function store(Request $request)
    {

        $serie = $request->all();
        Serie::create($serie);

        return redirect()->route('series.index')->with('mensagem.sucesso', 'Série Inserida com sucesso!');
    }

    public function destroy(Request $request) {

        Serie::destroy($request->serie);

        return redirect()->route('series.index')->with('mensagem.sucesso', 'Série apagada com sucesso!');
    }

    public function edit(Serie $serie, Request $request) {

        return view('series.edit')->with('series', $serie);

    }

    public function update(Serie $series, Request $request) {
        $series->nome = $request->nome;
        $series->save();

        return redirect()->route('series.index')->with('mensagem.sucesso', 'Série atualizada com sucesso!');
    }

}

Também estou enfrentando um probleminha chato no meu index, onde não consigo exibir minhas Flash Messages, podem ajudar com isso também?

index.blade.php

<x-layout title="Séries">

    <a href="{{route('series.create')}}" class="btn btn-dark mb-2">Adicionar</a>

   @isset( $mensagemSucesso ))
       <div class="alert alert-success">
          {{ $mensagemSucesso }}
       </div>
    @endisset

    <ul class="list-group">
        @foreach ($series as $serie)
        <li class="list-group-item d-flex justify-content-between align-items-center">
            {{ $serie->nome }}
           <span class="d-flex">
               <a href="{{ route('series.edit', $serie->id) }}" class="btn btn-primary btn-sm">
                   E
               </a>
                <form action="{{route('series.destroy', $serie->id)}}" method="post">
                @csrf
                    @method('DELETE')
                <button class="btn btn-danger btn-sm">X</button>
            </form>
           </span>
        </li>
        @endforeach
    </ul>
</x-layout>

Já troquei de @isset para @if e tentei outra lógica, mas a mensagem não é exibida de nenhuma forma.

Estou usando PHP 8.2.4 e Laravel 9.52.10.

Agradeço desde já.

3 respostas

Olá, Walison! Tudo bem?

Como está o seu arquivo edit.blade.php? Verifique se você enviou o :nome corretamente

Quanto ao problema de exibição das Flash Messages no seu arquivo index.blade.php, notei que há um pequeno erro de sintaxe no seu código. A condição @isset( $mensagemSucesso )) possui um parêntese a mais no final. Para corrigir, basta remover esse parêntese excedente, ficando assim:

@isset($mensagemSucesso)
   <div class="alert alert-success">
      {{ $mensagemSucesso }}
   </div>
@endisset

Veja se resolve :) Fico no aguardo

Olá, Vinicius! Estou bem e você? Obrigado pelo retorno.

Sobre o arquivo edit.blade.php:

<x-layout title="Editar Série {{$series->nome}}">
    <x-series.form action="{{route('series.update', $series->id)}}" />
</x-layout>

Sobre as flash messages:

Alterei o @isset e ainda assim não funcionou... :/

<x-layout title="Séries">

    <a href="{{route('series.create')}}" class="btn btn-dark mb-2">Adicionar</a>

   @isset( $mensagemSucesso )
       <div class="alert alert-success">
          {{ $mensagemSucesso }}
       </div>
    @endisset

    <ul class="list-group">
        @foreach ($series as $serie)
        <li class="list-group-item d-flex justify-content-between align-items-center">
            {{ $serie->nome }}
           <span class="d-flex">
               <a href="{{ route('series.edit', $serie->id) }}" class="btn btn-primary btn-sm">
                   E
               </a>
                <form action="{{route('series.destroy', $serie->id)}}" method="post">
                @csrf
                    @method('DELETE')
                <button class="btn btn-danger btn-sm"> X </button>
            </form>
           </span>
        </li>
        @endforeach
    </ul>
</x-layout>

No arquivo edit.blade.php você não está passando a variável $nome para o form.blade.php, você precisa usar o codigo da seguinte maneira:

<x-layout title="Editar Série '{{ $serie->nome }}'">
    <x-series.form :action="route('series.update', $serie->id)" :nome="$serie->nome" />
</x-layout>

Sobre as flash messages, o código aparenta estar certo, tente reiniciar o servidor e veja se funciona :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software