Autoload de clases con Composer

  • Por
Cómo incluir el código de los paquetes que se instalan vía composer en páginas PHP por medio del autoload de clases.

Una de las ventajas fundamentales de usar Composer es que nos podemos despreocupar sobre cómo se instalan, actualizan y se incluyen las dependencias en el código PHP. Sobre este último punto es en el que vamos a incidir en este capítulo del Manual de Composer.

Obviamente, cuando instalas una dependencia, una librería, una clase o cualquier código de terceros en general, es porque quieres usarla dentro de tu código PHP. Si instalas una librería a mano tendrás que saber en qué carpeta la has metido y cómo se llaman los ficheros con el código que necesitas incluir, pero si lo haces desde este sistema de gestión de dependencias puedes ahorrate ese trabajo de organización gracias al autoload de clases con Composer.

Archivo autoload.php

El archivo autoload.php lo crea Composer automáticamente en la carpeta "vendor" y contiene el código para que tus librerías se puedan cargar automáticamente, por demanda según se vayan usando.

Tengamos una o decenas de dependencias, el único archivo que tenemos que incluir en una página PHP del proyecto es el mencionado autoload.php.

//autoload de composer
require 'vendor/autoload.php';
Nota: no te preocupes por tener muchas dependencias y solo usar unas pocas en una página en concreto. Este archivo autoload no carga nada especialmente, solo tiene el script de autocarga de clases, no resultará más pesado para PHP de lo estrictamente necesario, pues solamente se irán cargando las clases que vayas usando en tu código.

El la carpeta "vendor" debe de estar en la raíz de tu proyecto, típicamente fuera del directorio "document root", para que no sea accesible directamente a través de una URL de tu sitio web . Pero claro, depende desde donde carges este archivo de autoload, la ruta de tu include puede ser diferente.

Usar una dependencia instalada

Realmente, cargado el autoload.php no tenemos mucho más que hacer. Simplemente, cuando se necesiten las clases (de programación orientada a objetos), porque se instancien objetos o se haga uso de sus métodos estáticos, éstas estarán disponibles para nosotros.

Ten en cuenta que las dependencias de packagist se organizan por namespaces en PHP, por lo que a la hora de usar las clases tendrás que hacer el correspondiente "use", o bien escribir el namespace completo donde está tu clase.

Por ejemplo, esto hace uso de un método estático de un sistema de plantillas llamado Plates, para inicializarse. Observa el namespace "League\Plates". El nombre de la clase es "Engine".

$templates = new League\Plates\Engine($raiz . '../data/plantillas');

Ese mismo código también podría hacerse con el correspondiente "use" en el que indicamos la clase y su namespace. Una vez que se declara que se va a usar dicha clase en el correspondiente namespace, ya podemos invocar sus métodos o el constructor sin indicar el namespace completo.

use League\Plates\Engine;
$templates = new Engine($raiz . '../data/plantillas');

Resulta obvio, pero queremos remarcar que este código no funcionaría si no se ha hecho el correspondiente autoload con PHP, que nos ofrece el archivo vendor/autoload.php.

Nota: Si lo necesitas, puedes encontrar más información sobre espacios de nombres en el artículo Namespaces en PHP.

Configurar el sistema de autocarga de clases

El proceso descrito antes es el trabajo básico que tendremos que realizar para cargar las librerías, de una manera ágil, gracias a Composer. Pero podría ser necesario para nuestras aplicaciones configurar el sistema de autocarga de clases. En la mayoría de los casos no será necesario, pero puede venirnos bien si queremos aprovecharnos del autoload de Composer para cargar de manera automática las clases de nuestro propio proyecto.

Para ello se define un nuevo campo, llamado "autoload" en el archivo composer.json.

Ese campo nos permite indicar un namespace y las clases que se encuentran detrás de ese namespace.

"autoload": {
    "psr-4": {"MiNamespace\\": "mi_carpeta/"}
}

Esto indica que las clases del namespace "MiNamespace" las tiene que ir a buscar al directorio "mi_carpeta" (suponiendo que "mi_carpeta" se encuentra colgando la raíz, por lo que sería un hermano del directorio "vendor").

Solo un único detalle. Una vez has configurado el sistema de autoload de composer, debes correr el comando "dump-autoload", para que se vuelva a generar y optimizar todo el proceso de autoload de clases de Composer.

Este paso es tan sencillo como lanzar el comando:

composer dump-autoload

Ahora que tenemos el archivo "vendor/autoload.php" regenerado, ya podremos tener disponibles las clases de este namespace para su autocarga.

Configurar el sistema de autocarga en tiempo de ejecución

Sobre el sistema de autocarga también nos viene bien saber que se puede configurar en tiempo de ejecución, y no solamente mediante el composer.json. Esto es útil cuando existen ciertas clases que solo se usan en determinado momento, como clases de testing y no las necesitamos para nada cuando el sitio está funcionando de manera general.

Lo consigues gracias a una instancia de un objeto "loader" que te devuelve el require de tu autoload.

$loader = require 'vendor/autoload.php';
$loader->addPsr4('MiNamespace\\', 'mi_carpeta');

Conclusión

No hay mucho más que decir del sistema de autoload de clases de Composer. Realmente es solo ponerse a usarlo y disfrutar de su comodidad.

Puedes encontrar más información en la documentación de composer, en la página de autoloading y en el Manual de Composer.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir