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.
Supongamos una API que debe validar pagos con Mercado Pago y actualizar el estado de una orden.
Creamos application/services/Payments/.
<?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);
}
}
<?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']);
}
}
<?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.