Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Problema no método destroy e da execução do método de excluir da Laravel das séries

<?php

use App\Http\Controllers\SeriesController;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return redirect('/series');
});

Route::resource('/series', SeriesController::class)
    ->only(['index', 'create', 'store']);

Route::post('/series/destroy/{serie}', [SeriesController::class, 'destroy'])->name('series.destroy');

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

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

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

public function destroy(Request $request){

        $request->validate([
            'serie' => 'required|integer|exists:series,id'
        ]);

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

        return to_route('series.index');

    }

E me ajudem a solucionar esse caso!

1 resposta
solução!

Oi, Carlos! Como vai?

O problema aqui é que você está usando o método POST na rota para excluir, mas o Laravel espera que o método seja DELETE para o destroy funcionar corretamente com Route::resource. Além disso, o parâmetro serie precisa ser enviado corretamente no formulário.

Resolva fazendo o seguinte:

  1. Ajuste a rota para usar DELETE no padrão do Laravel:

    
    Route::delete('/series/{serie}', [SeriesController::class, 'destroy'])->name('series.destroy');
    
  2. No formulário Blade, use o helper @method('DELETE') para simular o método:

    
    
     @csrf
     @method('DELETE')
     
    
    
  3. Ajuste o método destroy para receber diretamente o modelo ou o ID:

    
    public function destroy(Serie $serie) {
     $serie->delete();
     return to_route('series.index');
    }
    

Explicação: usando @method('DELETE'), o Laravel entende que a requisição é do tipo DELETE, fazendo com que a rota destroy definida no Route::resource funcione corretamente.

Versão sem acentuação do metodo:


public function destroy(Serie $serie) {
    $serie->delete();
    return to_route('series.index');
}

Esse código exclui a série recebida e redireciona para a lista de séries.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.