2 visitas

Cómo activar PSR-4 en CodeIgniter 3 para usar inyección de dependencias sin dolores de cabeza

Guía práctica para habilitar PSR-4 en CodeIgniter 3 y preparar el proyecto para usar inyección de dependencias real.

Aunque CodeIgniter 3 no fue diseñado con inyección de dependencias en mente, es totalmente posible integrarla si configuramos PSR-4 en composer.json y organizamos nuestro código fuera de application/. Esto permite escribir servicios testeables, desacoplados y reutilizables.

1. Configurar PSR-4 en composer.json

Creamos un namespace propio para los servicios:

{
    "autoload": {
        "psr-4": {
            "AppServices\\": "application/services/"
        }
    }
}

Ejecutamos:

composer dumpautoload

Creamos el directorio application/services/.

2. Crear un servicio real para un caso de uso

Ejemplo típico: un servicio para enviar mensajes transaccionales.

<?php

namespace AppServices;

use GuzzleHttp\Client;

final class MessageSender
{
    public function __construct(
        private Client $httpClient
    ) {}

    public function send(string $phone, string $text): bool
    {
        $response = $this->httpClient->post('https://api.sms.local/enviar', [
            'json' => [
                'telefono' => $phone,
                'mensaje' => $text,
            ]
        ]);

        return $response->getStatusCode() === 200;
    }
}

3. Usar el servicio dentro de CodeIgniter

CodeIgniter 3 no resuelve dependencias automáticamente, así que las instanciamos:

<?php

use AppServices\MessageSender;
use GuzzleHttp\Client;

class Notificaciones extends CI_Controller
{
    public function enviar()
    {
        $sender = new MessageSender(new Client());

        $ok = $sender->send('1130004455', 'Tu pago fue aprobado');

        echo $ok ? 'OK' : 'Error';
    }
}

Este enfoque permite sacar lógica del controlador, mejorar testeo y aplicar DI aunque el framework sea legacy.

Me dedico a crear soluciones web eficientes y a compartir mi conocimiento con la comunidad de desarrolladores.

Alejandro Leone
Backend Developer