Laravel 6

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:

  1. Un módulo: como el módulo de notas, tendría 7 acciones: listar, ver, crear, almacenar, editar, actualizar y eliminar.
  2. Un «feature» o característica: como un buscador: podría tener una o más acciones para procesar la búsqueda y mostrar resultados.
  3. 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