Sistema de autoload en Composer

autoload composer

Si no usamos Composer debemos cargar nuestras clases manualmente cada vez que las necesitemos y junto con ello estar dispuestos a lidiar con muchos errores, con Composer podemos tener N cantidad de paquetes y disponer de ellos de forma automática.. Aquí aprenderemos classmap, files, PSR-0 y PSR-4.


¿Cómo nuestro sistema sabrá de nuestras clases?

Solo debemos registrar nuestro autocargador Composer. Es un archivo que siempre tendremos disponible al momento de instalar cualquier paquete usando Composer, se encuentra en la carpeta vendor.

<?php
    

    require_once __DIR__ . 'vendor/autoload.php';

    //A partir de aquí disponemos de todos los paquetes 

¡plas, plas! ya no tendremos que preocuparnos por incluir nuestros archivos, sin embargo, tenemos que configurar a Composer para que soporte esta función. Hay algunas formas de hacerlo, podemos usar alguna o la combinación de ellos. Comenzamos con la explicación:

Lograremos hacerlo sabiendo que en el archivo composer.json tenemos la sección autoload y es la siguiente:

    "autoload": { 
    }

Un archivo configurado tendría esta apariencia y estructura:

{
    "name": "italomoralesf/autoload",
    "type": "project",
    "authors": [
        {
            "name": "italomoralesf",
            "email": "i@italomoralesf.com"
        }
    ],
    "require": {},
    "autoload": {}
}

Archivos (files)

Viendo de forma mas clara al objeto llamado autoload podemos aprovechar la funcionalidad de carga de archivos desde Composer. Aquí debemos definir la lista de archivos que deben incluirse. De esta forma no tendremos que colocar un grupo de llamadas de inclusión dentro de nuestro código. Aquí hay un ejemplo:

    "autoload": {
        "files": [
            "app/helpers.php"
        ]
    },

Nuestro archivo se llama helpers.php y te dejo ese ejemplo porque es la forma de crear helpers personalizados en Laravel ¡Es tan simple!, de hecho podemos tener una matriz de archivos y todos se cargaran de forma automática.

    "autoload": {
        "files": [
            "app/file1.php",
            "app/file2.php",
            "app/file3.php",
        ]
    },

Cuando nuestra aplicación arranque, estos archivos serán incluidos automáticamente por Composer y podemos usarlos :)

Mapa de clase - Classmap

A continuación, tenemos el mecanismo de carga llamado classmap. Como su nombre lo indica, este solo debería usarse para cargar clases (y no archivos con funciones como en el ejemplo anterior).

    "autoload": {
        "classmap": [
            // class o classes
        ]
    },

Seguimos usando el objeto autoload, sin embargo en este apartado el grupo se llama classmap y también puede contener una matriz de archivos. Toma en cuenta que al hacerlo debemos actualizar nuestro archivo autocargador y lo hacemos ejecutando el comando composer dump (refresca nuestro listado de clases, lo actualiza).

Para explicarlo mejor, cuando usamos el comando composer dump, Composer revisa todas las carpetas y subcarpetas que hemos especificado en nuestro array y registra nuestro listado de clases. Cuando intentes usar una clase, composer revisará el mapa y va a incluir el archivo automáticamente. Lo único malo, es que al incluir otras clases debes ejecutar el comando composer dump.

El Laravel se usa esta funcionalidad para registrar las clases que tengan que ver con la factories y seeders.

    "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
    },

PSR-0

PSR-0 es otro método de carga, y este requiere aprender un estándar. Debemos organizar y nombrar las clases de una manera especifica. El estándar dice:

  • Definir un namespace, imagina que será Rimorsoft ¿Está bien?.
  • Creamos la clase y puede llamarse para el ejemplo User, entonces esto quedaría así Rimorsoft\User.
  • Ahora que ya tenemos el namespace y la clase de ejemplo, debemos organizar nuestra carpeta. La carpeta se llamará src (la carpeta física es src y el nombre para acceder a ella es Rimorsoft\User).

Todo comienza en src (aunque puedes llamarla de otra manera), luego de aquí en las subcarpetas debemos tener cada segmento del namespace (es decir, tener fisicamente las carpetas con el nombre del namespace src/Rimorsoft/User.php). Es una convención que debe seguirse para que funcione.

A continuación, necesitaremos decirle a Composer dónde encontrar nuestras clases. Solo que no vamos a usar un mapa de clase, solo la carpeta padre.

    "autoload": {
        "psr-0": {
            "Rimorsoft\\": "src/"
        }
    },

Ya no es un Array, ahora tenemos un objeto PSR-0 dentro de autoload. Aquí colocamos el namespace elegido junto a la carpeta padre o contenedora. Al ejecutar el comando composer dump Composer registrará que todas las clases para el namescape Rimorsoft que se encuentran en la carpeta src.

Al ejecutar el famoso comando, ya no tenemos porque volver a ejecutarlo, así hayamos creados mas clases después. En otras palabras, si creamos una nueva clase dentro del namespace, Composer sabrá cómo encontrarla y lo hará de inmediato.

Esto es genial, pero vayamos a algo mejor… Se llama PSR-4.

PSR-4

La carga automática de PSR-4 sigue un formato similar al PSR-0, solo que no es necesario que proporcione una estructura de directorios completa para todo el namespace. Esta es la manera de trabajar hoy día. Con PSR-0 teníamos enormes arboles de carpetas.

Veamos cómo quedaría:

    "autoload": {
        "psr-4": {
            "Rimorsoft\\": "src/"
        }
    },

Es lo mismo a simple vista, solo hemos cambiado el 0 por el 4. Sin embargo, hay diferencias internas y por ahora te hago saber que PSR-4 es lo que debemos usar porque es la moderna tecnología.

Para PSR-4 debemos igualmente definir el namespace, la carpeta que contendrá nuestras clases (carpeta fuente) ¡y listo!.. Tendríamos al final del día src/User.php y para acceder a ella debemos escribir Rimorsoft\User

PSR-4 es la forma preferida de este tiempo, veamos las diferencias de una forma mas profesional. (Todo tiene que ver con el orden de subcarpetas y namespace).

PSR-0 vs PSR-4

Si definimos como namespace Rimorsoft\Online y carpeta contenedora de clases src tenemos lo siguiente:

  • En PSR-0 debemos tener las carpetas físicas src/Rimorsoft/Online/User.php, siguiendo con el ejemplo de clase User
  • En PSR-4 tendríamos src/User.php ya que el namespace representa la carpeta src.

Otra diferencia es que no podemos usar PSR-4 si no usamos namespace.

Es básico, hoy día usamos PSR-4, y en algunos casos podemos combinarlos tal cual lo hace Laravel, podríamos usar en un proyecto classmap, files y PSR-4. Ejemplo:

{
    "name": "italomoralesf/autoload",
    "type": "project",
    "authors": [
        {
            "name": "italomoralesf",
            "email": "i@italomoralesf.com"
        }
    ],
    "require": {},
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "Rimorsoft\\": "app/"
        },
        "files": [
            "app/helpers.php"
        ]
    },
}

Dí conmigo, ¡por fin entiendo el estándar PSR-4!

Recuerda comentar y compartir :)

Adquiere en preventa y aprovecha un gran descuento TDD en Laravel

Comparte en

Creado por: Venezuela Italo Morales

Profesor de #Laravel y #PHP en Rimorsoft Online

Más información


El auth de laravel trabaja con $_SESSION?.

el auth de laravel trabaja basado en tokens o con el objeto session de php ...

Rutas de Laravel no funcionan

Buenas a todos, tengo un problema, ultimamente, cada vez que creo un nuevo proyecto de Laravel las rutas de este no funcionan. Por ejemplo: si creo el proyecto, éste se crea, pero al agregarle el sistema de autenticación: "auth" se generan tanto las rutas en el archivo web.php y las vistas. pero si intento acceder a la sección de registro o inicio de sesión me aparece el e...

form request ajax laravel (Mostrar error de validación de formulario con ajax)

Hola, tengo una consulta por hacer. Quisiera conocer sus opiniones, sobre como mostrar los errores de validación con ajax cuando utlizo la clase Form Request. Debo decir que el mensaje de registrado con éxito si lo muestra, sin embargo los mensajes de error no los he podido mostrar. Gracias

//FORM REQUEST


public function rules()
    {
        return [
     ...

Select Dinámico

Hola buenas a todos estoy trabajando en un sistema en el cuál, en un formulario tengo un select para seleccionar datos de una tabla, y en la vista del formulario me funciona ya que me carga todos los datos que tengo almacenados en dicha tabla; pero cuando selecciono una de las opciones, sea cual séa la que seleccione, siempre se guarda el primer registro de la tabla... Es com...