Introducción a PHP-DI: qué es y para qué sirve
\n\nPHP-DI (PHP Dependency Injection) es una potente biblioteca para la inyección de dependencias (Dependency Injection, DI) en aplicaciones PHP. Implementa el patrón Inversion of Control (IoC) y proporciona un contenedor para la resolución automática de dependencias entre clases.
\n\n¿Para qué sirve PHP-DI? En proyectos PHP modernos (especialmente en frameworks como Laravel, Symfony, Slim), las clases a menudo dependen de otras clases. Sin un contenedor DI, tienes que crear manualmente todas las dependencias, lo que conduce a:
\n- \n
- Alto acoplamiento del código (tight coupling) \n
- Dificultad para realizar pruebas \n
- Duplicación de código al crear objetos \n
- Dificultades con el mantenimiento y la expansión \n
PHP-DI resuelve estos problemas determinando automáticamente qué clases necesita tu código y creándolas con las dependencias correctas. La biblioteca soporta:
\n- \n
- Inyección automática a través del constructor \n
- Definición de dependencias mediante anotaciones (phpDoc) \n
- Configuración a través de arrays, YAML o archivos PHP \n
- Carga diferida (lazy loading) \n
- Integración con frameworks populares \n
Instalación de PHP-DI
\n\nPHP-DI se instala a través de Composer, el gestor de paquetes estándar para PHP:
\n\ncomposer require php-di/php-di\n\nSi usas el framework Slim, instala el paquete de integración:
\n\ncomposer require php-di/slim-bridge\n\nPara Symfony hay un paquete separado:
\n\ncomposer require php-di/symfony-bridge\n\nDespués de la instalación, incluye el cargador automático de Composer en tu proyecto:
\n\nrequire __DIR__ . '/vendor/autoload.php';\n\nInicio rápido con un ejemplo de código
\n\nVeamos un ejemplo muy simple de uso de PHP-DI. Supongamos que tenemos una clase Mailer que depende de la clase Logger:
<?php\n// Clase Logger\nclass Logger {\n public function log($message) {\n echo "[LOG]: " . $message . "\\n";\n }\n}\n\n// Clase Mailer, que depende de Logger\nclass Mailer {\n private $logger;\n \n public function __construct(Logger $logger) {\n $this->logger = $logger;\n }\n \n public function send($to, $subject) {\n $this->logger->log("Enviando correo a {$to}: {$subject}");\n // Lógica de envío...\n }\n}\n\n// Creamos el contenedor DI\n$container = new DI\\Container();\n\n// Obtenemos el objeto Mailer — todas las dependencias se resuelven automáticamente\n$mailer = $container->get('Mailer');\n$mailer->send('user@example.com', '¡Hola!');\n?>\n\nEn este ejemplo, PHP-DI crea automáticamente una instancia de Logger y la pasa al constructor de Mailer. No necesitas escribir new Logger() — el contenedor lo hace por ti.
Métodos y funciones principales de PHP-DI
\n\n1. Container::get() — obtener un objeto del contenedor
\nQué hace: Extrae un objeto por su nombre (clase, interfaz o alias) del contenedor. Si el objeto aún no se ha creado, el contenedor lo crea junto con todas sus dependencias.
\nParámetros:
\n- \n
string $name— nombre de la clase, interfaz o alias \n
Ejemplo:
\n$container = new DI\\Container();\n$logger = $container->get('Logger'); // Crea y devuelve el objeto Logger\n$mailer = $container->get('Mailer'); // Crea Mailer con Logger dentro\n\n2. Container::set() — registro de una definición
\nQué hace: Registra una definición para una clase, interfaz o alias. Permite especificar cómo se debe crear el objeto.
\nParámetros:
\n- \n
string $name— nombre de la clase o alias \n mixed $definition— des
También en la biblioteca
Mocha para JavaScript (Node.js): guía completa con ejemplos
Validación de datos en PHP: guía y herramientas
Generación de PDF en Java: revisión de las mejores bibliotecas (iText, Apache PDFBox, OpenPDF)
mapstructure en Go: guía completa con ejemplos prácticos
Biblioteca estándar de JavaScript (Node.js): una visión completa