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


Spatie/Laravel Permission ¿Cómo agregar campos en la tabla "roles"?

Hola, mi consulta es la siguiente:

Relacioné la tabla "roles" con mi tabla** "empresa**", es decir, en la tabla "roles", tengo el campo "id_empresa", en la vista, están los campos necesarios y el select de la empresa pero al querer guardar los datos, me arroja el siguiente error: ** "The given role or permission should use guard web instead of Empresas. "** No ...

SOFTWARE PARA CONSULTORIOS MEDICOS

Hola Amigos. soy nuevo en el grupo.. me gustaria saber si alguien tiene o tuvo algun proyecto basado en laravel, para consultorios medicos? ...

sincronización de componentes hermanos

un gran saludo a la comunidad rimorsorf... espero de su valiosa ayuda para mi problema que es el siguiente:

tengo dos componentes en el mismo nivel, el primero crea una tabla con una lista de procesos por tramitar y el segundo componente lista en una tabla los procesos que se han asignado para tramitar; cuando en la primera tabla se asigna el proceso este debe desaparecer de...

plantilla blade y vuejs2

buenas noches comunidad, por casualidad alguien sabrá si se puede integrar la plantilla de laravel blade en vuejs2 component??, gracias dee antemano...