Laravel: Controladores (parte 3)

En esta lección aprenderemos a usar y crear controladores. Sacaremos la lógica del archivo app.php y dejaremos escrito varios fragmentos de código según la convención de nombres de variables y métodos, creando controladores para tal fin. Es muy importante conocer la convención de la nomenclatura.

Archivos que vamos a investigar en esta lección
  • routes/web.php
  • app/Http/Controllers
Consideraciones
  • Los controladores en versiones anteriores se llaman de otra forma
  • Hemos instalado otra extensión de Visual Studio Code, llamada php Intelephense, que autocompleta nombres de controladores y resalta errores en el código (entre otras cosas)
Crear controladores

Un controlador será un archivo php que tenemos que crearlo en la carpeta app/Http/Controllers. Podemos crearlo manualmente, y también desde la terminal.

php artisan make: controller HomeController

Desde la terminal de Git Bash, navegaremos hasta la carpeta del proyecto y escribiremos el siguiente código para crear un controlador de nombre HomeController. Los nombres se escriben así por convención. Al hacerlo así, desde la terminal y con Artisan, se nos escribe el código que necesitamos para empezar.

php artisan make: controller HomeController

El archivo empieza con el namespace, y nos centraremos en la clase HomeController que se ha creado, donde escribiremos el método.

Usar controladores

En el archivo web.php escribiremos la línea que se refiere al controlador que vamos a usar:

use App\Http\Controllers\HomeController;

Nuestra ruta para la home ahora debe quedarse así, sustituyendo la función por el uso del controlador:

Route::get('/', HomeController::class);

Y el controlador HomeController:

class HomeController extends Controller
{
    public function __invoke(){
        return "Bienvenido a mi proyecto de Laravel";
    }
}

Ya podemos visitar la home con el navegador y ver el mensaje «Bienvenido a mi proyecto de Laravel». Nótese que hemos nombrado a la función __invoke. Esto se escribe así por convención, tanto el hecho de que comience con dos guiones como el nombre del método.

Resumen de lo anterior
  • Creamos el controlador vacío con la consola usando el comando de artisan, respetando la convención de los nombres.
  • En routes/web.php, llamamos al controlador con use
  • Quitamos la función de la ruta de la home y llamamos al controlador usando el método class
  • En el archivo HomeController creado, escribimos el mensaje de bienvenida dentro de la clase del controlador con una función pública llamada __invoke(). Si no se especifica ningún nombre de método, el método de la calse será el método __invoke (lo tenemos en cuenta como concepto para la continuación).
Seguimos creando controladores

Mirando atentamente el siguiente código de web.php, vemos que todos tienen que ver que la URL comienza con la palabra «cursos». Para ello crearemos un único controlador para administrar el código que se muestra más abajo. Comentaremos todas las rutas y nos quedaremos con estas:

Route::get('cursos', function () {
    return "Bienvenido a la página de cursos";
});

Route::get('cursos/create', function () {
    return "Inserción de formulario";
});

Route::get('cursos/{curso}', function ($curso) {
    return "Url con la variable $curso";
});

Podemos crear el controlador desde la terminal de Visual Studio Code, con el comando que hemos usado antes. Ahora nombraremos nuestro controlador como CursoController, en singular por convención, y usando las mayúsculas como hemos hecho antes:

php artisan make:controller CursoController

Usaremos los siguientes nombres de los métodos: index, create y show. El método __invoke se usa solamente para una única ruta, en este caso tenemos tres. Como cada una de ellas está destinada a mostrar una cosa en particular (un índice, un formulario y algo de contenido) usamos estos tres nombres. Son nombres usados (de nuevo) por convención, aunque podríamos usar los que queramos. Nuestra clase «vacía» estará de la siguiente manera:

class CursoController extends Controller
{
    public function index(){

    }

    public function create(){

    }

    public function show(){

    }
}

Pondremos dentro de cada método cada uno de los mensajes que nos retornaba cada ruta. Como vemos en el código, la variable $curso está ahora dentro del método $show:

class CursoController extends Controller
{
    public function index(){
        return "Bienvenido a la página de cursos";
    }

    public function create(){
        return "Inserción de formulario";
    }

    public function show($curso){
        return "Url con la variable $curso";
    }
}

Y ya en web.php para usar el método con nuestras rutas:

use App\Http\Controllers\CursoController;

Para llamar a cada uno de los métodos de CursoController (index, create y show) no podemos llamar sólo al controlador, pues esto buscaría el método __invoke (y este controlador no tiene tal método). Así que le pasaremos en un array, entre corchetes, el nombre del controlador con ::class y el nombre de cada método entre comillas, y las rutas quedarían como sigue:

Route::get('/', HomeController::class);

Route::get('cursos', [CursoController::class, 'index']);

Route::get('cursos/create', [CursoController::class, 'create']);

Route::get('cursos/{curso}', [CursoController::class, 'show']);
Resumen
  • Hemos creado otro controlador, esta vez con tres funciones, cuyos nombres se usar así por convención, según lo que hace cada uno
  • Podemos crear controladores también desde la terminal de Visual Studio Code
  • A la hora de usar el controlador desde el archivo de rutas, lo hemos llamado tres veces (uno por cada ruta) usando un array para llamar a cada uno de sus métodos.

Recursos

Enlace de Youtube: https://www.youtube.com/watch?v=0YxgCH2R2bE&list=PLZ2ovOgdI-kWWS9aq8mfUDkJRfYib-SvF&index=4