Todos los artículos

Actions vs Repositories en Laravel

Julian Beaujardin
Julian Beaujardin October 2nd, 2024

En Laravel, existen diferentes enfoques para organizar el código al interactuar con modelos y lógica de negocio. Dos patrones comunes son Acciones y Repositorios. Aquí tienes un desglose de cada uno y cómo se comparan:

Acciones (Clases de Acción) en Laravel

  • Propósito: Las acciones encapsulan una tarea o lógica de negocio en una clase reutilizable. En lugar de poner la lógica en los controladores o modelos, las acciones se centran en mantener la lógica separada y reutilizable.

  • Caso de uso: Útil en escenarios donde tienes una sola responsabilidad, como el registro de usuarios, procesamiento de pedidos o notificaciones.

  • Organización: Las acciones generalmente se ubican en un directorio como app/Actions o app/Services. Cada clase de acción tiene un método como execute o handle que realiza la tarea.

  • Ejemplo:

    class CreateUserAction
    {
        public function execute(array $data)
        {
            return User::create($data);
        }
    }
    
  • Ventajas:

    • Clara responsabilidad única para cada acción.
    • Hace que el código sea más legible y fácil de probar.
    • Reutilizable en diferentes partes de la aplicación.
  • Desventajas:

    • Puede llevar a tener muchas clases pequeñas si se usa en exceso.
    • No siempre es necesario para operaciones simples.

Repositorios en Laravel

  • Propósito: Los repositorios abstraen la lógica de la base de datos del controlador o la lógica de negocio. En lugar de consultar modelos directamente en los controladores, el patrón repositorio crea una capa intermedia.

  • Caso de uso: Útil para manejar consultas complejas y gestionar el acceso a los datos de una manera limpia y organizada. Ayuda a mantener los controladores delgados al eliminar la lógica de consulta.

  • Organización: Los repositorios generalmente se ubican en app/Repositories, con interfaces e implementaciones separadas.

  • Ejemplo:

    interface UserRepositoryInterface
    {
        public function findByEmail($email);
    }
    
    class UserRepository implements UserRepositoryInterface
    {
        public function findByEmail($email)
        {
            return User::where('email', $email)->first();
        }
    }
    
  • Ventajas:

    • Desacopla la lógica de acceso a los datos del controlador.
    • Es más fácil cambiar el almacenamiento de datos (por ejemplo, reemplazar Eloquent ORM con otra fuente de datos).
    • Ayuda en las pruebas unitarias al simular repositorios en lugar de consultar la base de datos.
  • Desventajas:

    • Puede agregar complejidad innecesaria para aplicaciones simples.
    • Sobrecarga al crear interfaces e implementaciones de repositorio.

Comparación

Aspecto Acciones Repositorios
Propósito Encapsular la lógica de negocio o una tarea única. Encapsular el acceso a los datos y las consultas.
Caso de uso Cuando quieres separar la lógica de negocio. Cuando quieres organizar la lógica de consulta.
Complejidad Menor complejidad, pero puede llevar a muchas clases. Mayor complejidad con más estructura.
Reusabilidad Lógica de negocio reutilizable en varios lugares. Lógica de consultas y acceso a datos reutilizable.
Pruebas Facilita las pruebas de lógica de negocio específica. Más fácil de simular en pruebas unitarias que implican datos.

Cuándo usar cada uno

  • Usa Acciones si tu objetivo principal es separar la lógica de negocio y hacerla reutilizable, sin enfocarte demasiado en la abstracción de datos.
  • Usa Repositorios si estás manejando lógica de consulta compleja y quieres desacoplar la capa de base de datos de la lógica de negocio.

Ambos patrones pueden usarse juntos si es necesario, pero es importante evaluar la complejidad de tu aplicación y evitar una sobre-ingeniería.