Jenner Acosta Diaz
Laravel 10

CRUD

Cómo listar y leer registros

Empezamos por nuestro controlador Cursos, vamos a obtener todos los cursos y enviarlos a la vista

public function index()
    {
        $cursos = Curso::all();
        return view('courses.index', compact('cursos'));
    }

En al vista de Cursos los vamos a listar de la siguiente manera

@section('content')
    <h1>Page of courses</h1>
    <ul>
        @foreach ($cursos as $curso)
            <li>{{ $curso->name }}</li>
        @endforeach
    </ul>
@endsection

Ahora no es lo más efectivo, es mejor mostrar la data de manera paginada, entonces en vez de usar all() vamos a usar paginate()

public function index()
    {
        $cursos = Curso::paginate();
        return view('courses.index', compact('cursos'));
    }

Usariamos el parametro page para listar las otras páginas

/courses?page=1

En la vista deberíamos crear los botones para interactuar con las páginas

@section('content')
    <h1>Page of courses</h1>
    <ul>
        @foreach ($cursos as $curso)
            <li>{{ $curso->name }}</li>
        @endforeach
    </ul>

    {{ $cursos->links() }}
@endsection

Vamos a asignar un name a cada ruta, con la intención de crear un botón que nos dirija a crear un nuevo curso

Route::controller(CourseController::class)->group(function(){
    Route::get('/courses', 'index')->name('courses.index');
    Route::get('/courses/create', 'create')->name('courses.create');
    Route::get('/courses/{course}', 'show')->name('courses.show');
});

Ahora que tiene un name, puede asignar el link a mi enlace

<a href="{{ route('courses.create') }}">Crear Curso</a>

Vamos a agregarle su link respectivo a cada curso

@foreach ($cursos as $curso)
    <li><a href="{{ route('courses.show', $curso->id) }}">{{ $curso->name }}</a></li>
@endforeach

Ahora en el controlador vamos a mostrar un curso para que desde su vista lo podamos usar

public function show($id)
{
    $curso = Curso::find($id);
    return view('courses.show', compact('curso'));
}
@extends('layouts.template')

@section('title', 'Curso '.$curso->name)

@section('content')
    <h1>Course {{ $curso->name }}</h1>
    <p><b>Categoria:</b> {{ $curso->categoria }}</p>
    <p><b>Resumen:</b> {{ $curso->description }}</p>
    <a href="{{ route('courses.index') }}">Volver a Cursos</a>
@endsection

Create – Agregar y Actualizar registros desde un formulario

Vamos a crear nuestro formulario en la vista create

@section('content')
    <h1>Page for creating course</h1>
    <form action="">
        <label >
            Nombre: <br>
            <input type="text" name="">
        </label>
        <br>
        <label >
            Description: <br>
            <textarea name="description" rows="5"></textarea>
        </label>
        <br>
        <label>
            Categoría: <br>
            <input type="text" name="categoria">
        </label>
    </form>
@endsection

Vamos a asignarle una ruta

Route::post('/courses', 'store')->name('cursos.store');

y Vamos a crear su método

public function store()
{
        
}
<form action="{{ route('courses.store') }}" method="POST">

    @csrf

    <label >
        Nombre: <br>
        <input type="text" name="">
    </label>
    <br>
    <label >
        Description: <br>
        <textarea name="description" rows="5"></textarea>
    </label>
    <br>
    <label>
        Categoría: <br>
        <input type="text" name="categoria">
    </label>
    <br>
    <button type="submit">Enviar Formulario</button>
</form>

Ya podríamos probar el formulario y tener un resultado como el siguiente

{
"_token": "lWr0hzw57M0vFfKcrhLsWlPJiayJHlfmH65f2a3Z",
"name": "Jenner",
"description": "Desc",
"categoria": "Dev"
}

Ahora vamos a crear un nuevo registro

public function store(Request $request)
    {
        $curso = new Curso();
        $curso->name = $request->name;
        $curso->description = $request->description;
        $curso->categoria = $request->categoria;

        $curso->save();

        return redirect()->route('courses.show', $curso->id);
    }

Update

Vamos crear nuestra ruta para Editar un Post

Route::get('/courses/{id}/edit', 'edit')->name('courses.edit');

Ahora nuestro método

public function edit(Curso $curso)
    {
        return view('courses.edit', compact('curso'));
    }

Creamos nuestra vista

@extends('layouts.template')

@section('title', 'Create Curso')

@section('content')
    <h1>Page for edit course</h1>
    
    <form action="{{ route('courses.update', $curso->id) }}" method="POST">

        @csrf
        @method ('PUT')

        <label >
            Nombre: <br>
            <input type="text" name="name" value="{{ $curso->name }}">
        </label>
        <br>
        <label >
            Description: <br>
            <textarea name="description" rows="5">{{ $curso->description }}</textarea>
        </label>
        <br>
        <label>
            Categoría: <br>
            <input type="text" name="categoria" value="{{ $curso->categoria }}">
        </label>
        <br>
        <button type="submit">Actualizar Formulario</button>
    </form>
@endsection

Creamos nuestra ruta

Route::post('/courses/{curso}', 'update')->name('courses.update');

Creamos el método

public function update(Request $request, Curso $curso)
{
    $curso->name = $request->name;
    $curso->description = $request->description;
    $curso->categoria = $request->categoria;

    $curso->save();

    return redirect()->route('courses.show', $curso->id);
}

Validar formularios

Vamos a validad el envio de data, lo hacemos en nuestro controllador de la siguiente manera:

public function store(Request $request)
    {

        $request->validate([
            'name' => 'required',
            'description' => 'required',
            'categoria' => 'required'
        ]);

        $curso = new Curso();
        $curso->name = $request->name;
        $curso->description = $request->description;
        $curso->categoria = $request->categoria;

        $curso->save();

        return redirect()->route('courses.show', $curso->id);
    }

Ahora para mostrar el mensaje de error

@extends('layouts.template')

@section('title', 'Create Curso')

@section('content')
    <h1>Page for creating course</h1>
    
    <form action="{{ route('courses.store') }}" method="POST">

        @csrf

        <label >
            Nombre: <br>
            <input type="text" name="name" value="{{ old('name') }}">
        </label>
        @error('name')
            <br>
            <small>*{{ $message }}</small>
            <br>
        @enderror
        <br>
        <label >
            Description: <br>
            <textarea name="description" rows="5">{{ old('description') }}</textarea>
        </label>
        <br>
        @error('description')
            <br>
            <small>*{{ $message }}</small>
            <br>
        @enderror
        <label>
            Categoría: <br>
            <input type="text" name="categoria" value="{{ old('categoria') }}">
        </label>
        @error('categoria')
            <br>
            <small>*{{ $message }}</small>
            <br>
        @enderror
        <br>
        <button type="submit">Enviar Formulario</button>
    </form>
@endsection

Ahora hay que mantener los campos correctamente llenados, eso lo hacemos con:

value="{{ old('name') }}"

DELETE

Creamos nuestra Ruta

Route::delete('/courses/{curso}', 'destroy')->name('courses.destroy');

Creamos nuestro metodo

public function destroy(Curso $curso)
{
    $curso->delete();
     return redirect()->route('courses.index');
}

En nuestra vista agregariamos el siguiente metodo

<form action="{{ routes('courses.destroy', $curso) }}" method="POST">
    @csrf
    @method('DELETE')
    <button type="submit">Eliminar</button>
</form>

Optimización

Podemos optimizar todas nuestras rutas usando solo

Route::controller(CourseController::class)->group(function(){
    Route::resource('courses', CourseController::class);
});

Para cambiar el idioma de los links create and edit puedemos agregar en AppServiceProviders:

public function boot(): void
{
    Route::resourceVerbs([
    'create' => 'crear',
    'edit' => 'editar'
    ]);
}

Ahora puedes cambiar el nombre de la tua con

Route::resource('asiganturas', CourseController::class)->parameters(['asiganturas' => 'course'])->names('courses');