2 visitas

Inyección de dependencias en CodeIgniter 3 para APIs modernas sin romper el legacy

Cómo usar DI con servicios PSR-4 para modernizar APIs en CI3 sin reescribir todo.

Cuando CI3 se usa como backend de APIs modernas, es clave que la lógica esté desacoplada del framework. Con PSR-4 y DI, podemos construir servicios sólidos y migrables.

1. Caso real: API de pagos

Supongamos una API que debe validar pagos con Mercado Pago y actualizar el estado de una orden.

Creamos application/services/Payments/.

2. Servicio de validación

<?php

namespace Payments;

use GuzzleHttp\Client;

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

    public function validate(string $paymentId): array
    {
        $res = $this->httpClient->get(
            "https://api.mercadopago.com/v1/payments/{$paymentId}"
        );

        return json_decode($res->getBody()->getContents(), true);
    }
}

3. Servicio de negocio

<?php

namespace Payments;

use CI_DB_query_builder;

final class PaymentProcessor
{
    public function __construct(
        private CI_DB_query_builder $db,
        private PaymentValidator $validator
    ) {}

    public function process(string $paymentId): bool
    {
        $data = $this->validator->validate($paymentId);

        if ($data['status'] !== 'approved') {
            return false;
        }

        return $this->db
            ->where('payment_id', $paymentId)
            ->update('ordenes', ['estado' => 'pagado']);
    }
}

4. Controlador API

<?php

use Payments\PaymentValidator;
use Payments\PaymentProcessor;
use GuzzleHttp\Client;

class Pagos extends CI_Controller
{
    public function validar()
    {
        $validator = new PaymentValidator(new Client());
        $service = new PaymentProcessor($this->db, $validator);

        $ok = $service->process($this->input->post('id'));

        echo json_encode(['ok' => $ok]);
    }
}

Este patrón permite modernizar APIs sin romper la base legacy y sin necesidad de una reescritura total.

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

Alejandro Leone
Backend Developer