2-CRUD de Tareas en Laravel (Sencillo con Rutas Normales)-rutas

 CRUD de Tareas en Laravel (Sencillo con Rutas Normales)

Manteniendo la simplicidad de tu ejemplo original pero usando rutas normales en lugar de resource, aquí tienes la versión modificada:

1. Configuración inicial (igual)

bash
composer create-project laravel/laravel task-crud
cd task-crud

2. Base de datos

.env:

env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_tasks
DB_USERNAME=root
DB_PASSWORD=

3. Migración y Modelo (igual)

bash
php artisan make:model Task -m

database/migrations/xxxx_create_tasks_table.php:

php
public function up()
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}
bash
php artisan migrate

4. Modelo Task (igual)

app/Models/Task.php:

php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    use HasFactory;

    protected $fillable = ['name'];
}

5. Controlador modificado para rutas normales

bash
php artisan make:controller TaskController

app/Http/Controllers/TaskController.php:

php
<?php

namespace App\Http\Controllers;

use App\Models\Task;
use Illuminate\Http\Request;

class TaskController extends Controller
{
    public function index()
    {
        $tasks = Task::latest()->get();
        return view('tasks.index', compact('tasks'));
    }

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

    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|max:255',
        ]);

        Task::create($request->all());

        return redirect('/tareas')
            ->with('success', 'Tarea creada correctamente');
    }

    public function edit($id)
    {
        $task = Task::findOrFail($id);
        return view('tasks.edit', compact('task'));
    }

    public function update(Request $request, $id)
    {
        $request->validate([
            'name' => 'required|max:255',
        ]);

        $task = Task::findOrFail($id);
        $task->update($request->all());

        return redirect('/tareas')
            ->with('success', 'Tarea actualizada correctamente');
    }

    public function destroy($id)
    {
        $task = Task::findOrFail($id);
        $task->delete();

        return redirect('/tareas')
            ->with('success', 'Tarea eliminada correctamente');
    }
}

6. Vistas modificadas

Estructura de directorios:

text
resources/views/
├── layouts/
│   └── app.blade.php
└── tasks/
    ├── index.blade.php
    ├── create.blade.php
    └── edit.blade.php

resources/views/tasks/index.blade.php:

php
@extends('layouts.app')

@section('content')
<div class="container">
    <h1>Lista de Tareas</h1>
    
    @if(session('success'))
        <div class="alert alert-success">
            {{ session('success') }}
        </div>
    @endif

<a href="{{ route('tareas.create') }}" class="btn btn-primary mb-3">Nueva Tarea</a>
<a href="{{ url('/tareas/crear') }}" class="btn btn-primary mb-3">Nueva Tarea</a>
<a href="/tareas/crear" class="btn btn-primary mb-3">Nueva Tarea</a> @if($tasks->isEmpty()) <div class="alert alert-info">No hay tareas registradas</div> @else <ul class="list-group"> @foreach($tasks as $task) <li class="list-group-item d-flex justify-content-between align-items-center"> {{ $task->name }} <div> <a href="/tareas/editar/{{ $task->id }}" class="btn btn-sm btn-success me-1">Editar</a> <form action="/tareas/eliminar/{{ $task->id }}" method="POST" class="d-inline"> @csrf @method('DELETE') <button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('¿Eliminar esta tarea?')">Eliminar</button> </form> </div> </li> @endforeach </ul> @endif </div> @endsection

resources/views/tasks/create.blade.php:

php
@extends('layouts.app')

@section('content')
<div class="container">
    <h1>Crear Nueva Tarea</h1>
    
    <form action="/tareas" method="POST">
        @csrf
        <div class="mb-3">
            <label for="name" class="form-label">Nombre de la tarea</label>
            <input type="text" name="name" class="form-control" required>
        </div>
        <button type="submit" class="btn btn-primary">Guardar</button>
        <a href="/tareas" class="btn btn-secondary">Cancelar</a>
    </form>
</div>
@endsection

resources/views/tasks/edit.blade.php:

php
@extends('layouts.app')

@section('content')
<div class="container">
    <h1>Editar Tarea</h1>
    
    <form action="/tareas/actualizar/{{ $task->id }}" method="POST">
        @csrf
        @method('PUT')
        <div class="mb-3">
            <label for="name" class="form-label">Nombre de la tarea</label>
            <input type="text" name="name" class="form-control" value="{{ $task->name }}" required>
        </div>
        <button type="submit" class="btn btn-primary">Actualizar</button>
        <a href="/tareas" class="btn btn-secondary">Cancelar</a>
    </form>
</div>
@endsection

7. Rutas normales

routes/web.php:

php
<?php

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

// Página principal redirige a tareas
Route::redirect('/', '/tareas');

// Rutas para tareas
Route::get('/tareas', [TaskController::class, 'index'])->name('tareas.index');
Route::get('/tareas/crear', [TaskController::class, 'create'])->name('tareas.create');
Route::post('/tareas', [TaskController::class, 'store'])->name('tareas.store');
Route::get('/tareas/editar/{id}', [TaskController::class, 'edit'])->name('tareas.edit');
Route::put('/tareas/actualizar/{id}', [TaskController::class, 'update'])->name('tareas.update');
Route::delete('/tareas/eliminar/{id}', [TaskController::class, 'destroy'])->name('tareas.destroy');

8. Layout (igual que tu ejemplo original)

resources/views/layouts/app.blade.php:

php
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CRUD de Tareas</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container py-4">
        @yield('content')
    </div>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

9. Ejecutar la aplicación

bash
php artisan serve

Características de esta versión:

  1. Mantiene la simplicidad del ejemplo original

  2. Rutas normales en lugar de resource

  3. Estructura clásica de CRUD:

    • Listado (index)

    • Formulario de creación (create)

    • Formulario de edición (edit)

  4. Métodos HTTP claros (GET, POST, PUT, DELETE)

  5. Mensajes de confirmación

  6. Validación básica

  7. Diseño simple con Bootstrap

Ahora puedes acceder a:

Comentarios

Entradas más populares de este blog

0-Sistema de Tareas

13-CRUD en Laravel para Web y API con Rutas Normales (No Resource)

10-Introducción a Blade en Laravel con un Ejemplo Práctico