Carga automática de clases en PHP con Composer

Composer es el gestor de dependencias de PHP. Hace la vida más fácil a los desarrolladores porque soluciona el problema de tener que estar pendiente de las librerías de terceros que andamos poniendo y quitando en nuestros proyectos.

Carga automática de clases en PHP con Composer

Basta con crear un archivo composer.json en la carpeta raíz de nuestra aplicación y escribir la clave require:

{
    "require": {
        "vendor/package": "1.3.2",
        "vendor/package2": "1.*",
        "vendor/package3": "^2.0.3"
    }
}

Ahí escribimos los paquetes que necesitamos y Composer los instalará como por arte de magia junto con las dependencias correspondientes. Ya sabes, solo hay que ejecutar el comando:

composer install

Pero no solo eso…

¿Sabías que con Composer puedes poner un autoloader para cargar automáticamente las clases PHP de tu aplicación? Esta característica es un avance relativamente reciente que ayuda a mantener bien el código.

Allá por 2011, antes de la entrada en escena de Composer y Packagist, los desarrolladores de aplicaciones PHP solían poner un montón de sentencias include y require en su código fuente.

Cada vez que necesitaban incluir un archivo ponían un include o un require. ¡Vaya rollo! Teniendo en cuenta que el paradigma de orientación a objetos invita a escribir un archivo por clase PHP, lo anterior dificultaba el mantenimiento de la aplicación.
Composer permite poner un autoloader

Bueno, como alternativa podías utilizar la función spl_autoload_register o programar tu propio script de carga automática de clases. O si trabajabas con algún framework de desarrollo, el framework lo hacía por ti y te olvidabas para siempre de tener que solucionar ese problema.

Autoloader PSR-4

Si bien Composer viene con varios mecanismos de carga de clases nosotros nos centraremos ahora en el PSR-4, que es el predeterminado y el que se aconseja utilizar.

Es muy sencillo, PSR-4 no es más que una convención que tienes que seguir para que tus clases PHP se carguen de forma automática gracias a Composer. Primero tienes que entender, eso sí, como funcionan los namespaces. Mira este vídeo:



Si utilizas namespaces en tus proyectos PHP probablemente ya sabrás que están completamente separados de la estructura de ficheros. Los namespaces no tienen nada que ver con las carpetas, son dos cosas distintas.

Pues bien, a partir de ahora utiliza la misma jerarquía de nombres tanto en tus namespaces como en tus carpetas y ficheros. Tenemos que hacer ese mapeo, que los nombres coincidan. El siguiente paso es añadir una clave autoload al archivo composer.json utilizando la convención PSR-4. Y por último ejecutamos este comando, que hará la magia por nosotros:

composer dump-autoload --optimize

En resumen…

Estos son los pasos a seguir:

  • Crear tus clases PHP con namespaces
  • Aplicar la misma jerarquía de los namespaces a las carpetas
  • Añadir una clave autoload PSR-4 al archivo composer.json
  • Ejecutar el comando composer dump-autoload --optimize
  • Cargar el archivo autoload.php recién generado en tu app

Veamos un ejemplo

¿Sabías que el framework Slim utiliza PSR-4? Está disponible en GitHub, fíjate en la clave autoload de su archivo composer.json:

...
"autoload": {
    "psr-4": {
        "Slim\": "Slim"
    }
},
...

La clave autoload hace corresponder el namespace Slim con la carpeta Slim. El nombre de los namespaces de los archivos coincide con el de la carpeta donde están alojados, así pues las clases PHP se cargan automáticamente gracias a la convención:

Archivo Namespace del archivo
Slim/Exception/ContainerException.php Slim\Exception
Slim/Exception/ContainerValueNotFoundException.php Slim\Exception
Slim/Http/Cookies.php Slim\Http
Slim/Http/Environment.php Slim\Http

Pues ya está, ¡tú puedes hacer lo mismo en tus aplicaciones! Sigue la convención PSR-4. Con la convención implementada y con la clave autoload en tu composer.json, no olvides ejecutar este comando:

composer dump-autoload --optimize

Eso creará la carpeta /vendor/composer y el archivo /vendor/autoload.php. Este archivo contiene la lógica de carga automática de clases; así pues, para incluirlo en tu aplicación escribe:

require_once __DIR__ . '/vendor/autoload.php';

Esto es todo por hoy. Gracias por haber leído este post. Espero que te haya gustado y que lo compartas con tus amigos.