Laravel nos brinda una capa de controladores que nos permite organizar la lógica de nuestras rutas dentro de métodos llamados «acciones» y de clases conocidas como «controladores». En esta lección aprenderás cómo generar tu primer controlador desde la consola utilizando Artisan y cómo asociar rutas a acciones específicas dentro de dicho controlador.
Esta lección incluye un video premium
Regístrate para ver este video y cientos de lecciones exclusivas.
Mira el código en GitHub: actual, resultado, comparación.
Crear un controlador con Laravel
Podemos generar un nuevo controlador con el comando:
# php artisan make:controller NoteController
Deberíamos ver el mensaje «Controller created successfully» en la consola y de vuelta al editor deberíamos ver una nueva clase en app/Http/Controllers/NoteController
:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class NoteController extends Controller { // }
¿Qué es un controlador?
Un controlador no es más que una clase de PHP. Esta clase extiende de la clase App\Http\Controllers\Controller
que está dentro de tu aplicación (en el mismo directorio donde NoteController
fue generado).
Si abrimos app/Http/Controllers/Controller.php
podremos ver cómo dicha clase extiende de Illuminate\Routing\Controller
.
Debido a que estas dos clases se llaman Controller
, la clase de Laravel es importada con el alias BaseController
.
<?php namespace App\Http\Controllers; //... use Illuminate\Routing\Controller as BaseController; class Controller extends BaseController { //... }
Puedes aprender más sobre nombres de espacio en nuestro curso Curso de programación orientada a objetos con PHP.
Extender de los controladores base nos da funcionalidad adicional como veremos más adelante; pero esto es opcional, aún sin extender de Controller
tendremos un controlador válido:
<?php namespace App\Http\Controllers; class NoteController { // }
Es importante señalar que los controladores a los que hagamos referencia desde routes/web.php
deben tener el nombre de espacio App\Http\Controllers
y por lo tanto estar ubicados en el directorio app/Http/Controllers/
. Aunque esto se puede personalizar desde app/Providers/RouteServiceProvider.php
.
Crear acciones en el controlador
Una acción de un controlador no es más que un simple método de PHP. Este método debe ser público, por ejemplo:
<?php namespace App\Http\Controllers; class NoteController { public function create() { return view('add-note'); } }
La lógica dentro de dicho método dependerá de la acción que estés programando.
He creado la acción create
y he copiado en ella la lógica para mostrar el formulario de creación de notas.
Como ejercicio crea una acción llamada store
con la lógica para validar los datos, crear la nota y luego redirigir a la ruta notes
. Intenta hacerlo sin ver el archivo routes/web.php
.
Enlazar rutas a la acción de un controlador
Crear una o más acciones no es suficiente para que Laravel comience a usarlas, necesitamos enlazarlas desde el archivo de rutas correspondiente. Enlacemos la ruta notas/crear
a la acción create
dentro de NoteController
:
<?php // routes/web.php Route::get('notas/crear', 'NoteController@create') ->name('notes.create');
Fíjate cómo he reemplazado toda la función anónima con una cadena, dicha cadena contiene el nombre del controlador (partiendo de App/Http/Controllers
, por lo tanto, no hace falta colocar el nombre de espacio completo), seguido del símbolo de @
y luego el nombre de la acción. Si creaste la acción store
enlázala a la ruta Route::post('notas')
siguiendo los mismos pasos.
Te recomiendo que muevas y enlaces las acciones una por una, verificando que todo funciona en el navegador luego de cada cambio; puesto que si cometes un error te será mucho más fácil encontrarlo y corregirlo, o deshacer el cambio.
Luego de mover y enlazar todas las acciones, nuestro archivo de rutas lucirá así:
<?php <?php // routes/web.php Route::get('/', 'NoteController@index')->name('notes'); Route::get('notas/{id}', 'NoteController@show')->name('notes.show'); Route::get('notas/crear', 'NoteController@create')->name('notes.create'); // store... Route::get('notas/{id}/editar', 'NoteController@edit')->name('notes.edit');
Nuestro controlador se verá así – nota los imports luego de la declaración del nombre de espacio:
<?php namespace App\Http\Controllers; use App\Note; use Illuminate\Http\Request; use Illuminate\Validation\Rule; class NoteController extends Controller { public function index() { $notes = Note::all(); return view('notes', ['notes' => $notes]); } function show($id) { return 'Aquí veremos el detalle de la nota: '.$id; } public function create() { return view('add-note'); } // store... public function edit($id) { $note = Note::find($id); return ['note' => $note]; } }
He omitido la declaración de la ruta store
para que puedas realizar el ejercicio.
¿Cuántos controladores crear y cómo agruparlos?
En nuestra aplicación vamos a tener varios controladores, cada uno puede contener las acciones requeridas por:
- Un módulo: como el módulo de notas, tendría 7 acciones: listar, ver, crear, almacenar, editar, actualizar y eliminar.
- Un «feature» o característica: como un buscador: podría tener una o más acciones para procesar la búsqueda y mostrar resultados.
- Una página: por ejemplo el homepage o la página de contactos:
HomepageController
probablemente tendría una acción: para mostrar la página de inicio.ContactController
podría tener 2 acciones: una para mostrar la información de contacto junto con el formulario de contacto y otra para procesar dicho formulario.
Algunos desarrolladores también deciden crear controladores de una sola acción los cuales son útiles si solo requieres de una acción en un controlador.
Practica creando otros controladores junto con sus acciones y enlaces desde las rutas. Cuando estés listo pasa a la siguiente lección donde trabajaremos con la edición de registros.
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Validación de datos en Laravel 6 Lección siguiente Formulario para editar registros en Laravel 6