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.
Creamos directorios PSR-4:
application/
services/
- User/
-- UserService.php
-- UserRepository.php
En composer.json:
"psr-4": {
"DomainUser\\": "application/services/User/"
}
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();
}
}
<?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);
}
}
<?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.