4 visitas

Cómo estructurar servicios y repositorios externos en CodeIgniter 3 usando PSR-4

Práctica recomendada para separar lógica en servicios y repositorios PSR-4 dentro de CI3.

Cuando un proyecto CI3 crece, aparece el clásico problema: controladores llenos de lógica, consultas repetidas y tests difíciles. Para resolverlo, lo ideal es mover lógica a servicios y repositorios cargados vía PSR-4.

1. Estructura recomendada

Creamos directorios PSR-4:


application/
services/
- User/
-- UserService.php
-- UserRepository.php

En composer.json:

"psr-4": {
    "DomainUser\\": "application/services/User/"
}

2. Crear un repositorio de verdad

Ejemplo real: obtener usuarios activos para un dashboard.

<?php

namespace DomainUser;

use CI_DB_query_builder;

final class UserRepository
{
    public function __construct(
        private CI_DB_query_builder $db
    ) {}

    public function allActive(): array
    {
        return $this->db
            ->where('activo', 1)
            ->get('usuarios')
            ->result_array();
    }
}

3. Crear un servicio que use el repositorio

<?php

namespace DomainUser;

final class UserService
{
    public function __construct(
        private UserRepository $repo
    ) {}

    public function activeForDashboard(): array
    {
        $usuarios = $repo->allActive();

        return array_map(fn($u) => [
            'nombre' => $u['nombre'],
            'email' => $u['email']
        ], $usuarios);
    }
}

4. Consumir en CI3

<?php

use DomainUser\UserRepository;
use DomainUser\UserService;

class Dashboard extends CI_Controller
{
    public function index()
    {
        $repo = new UserRepository($this->db);
        $service = new UserService($repo);

        $data['usuarios'] = $service->activeForDashboard();

        $this->load->view('dashboard', $data);
    }
}

Esto reduce acoplamiento y habilita tests unitarios sobre servicios y repositorios sin cargar CodeIgniter.

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

Alejandro Leone
Backend Developer