
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');