pupadevs/laramain

Install CQRS with DDD folder structure and Command/Query Buses for the specified entity

Fund package maintenance!
Paypal

2.0.0 2024-09-24 17:54 UTC

This package is auto-updated.

Last update: 2025-03-10 01:25:13 UTC


README


Packagist Version License Total Downloads PHP Version Laravel

Descripción

Pupadevs\Laramain Es un paquete Laravel diseñado para facilitar la implementación de la arquitectura DDD (Domain-Driven Design) y CQRS (Command Query Responsibility Segregation) en tus aplicaciones Laravel.

Requisitos

  • PHP >= 8.2
  • Laravel >= 10x

Instalación

Para instalar el paquete es necesario tener instalado Composer. https://getcomposer.org/download/ Ejecuta el siguiente comando

composer require pupadevs/laramain

Uso de comandos de artisan

1.Comando Artisan con parametro Este comando te pedirá que ingreses un nombre para tu dominio. Usará ese nombre para crear la estructura de carpetas siguiendo la arquitectura DDD (Domain-Driven Design). La carpeta principal llevará el nombre que hayas proporcionado como dominio, y dentro de ella se generarán las subcarpetas correspondientes para organizar tu proyecto de acuerdo con los principios de DDD.

php artisan laramain:install {nombreDominio}
php artisan vendor:publish --provider="Pupadevs\Laramain\Providers\PackageServiceProvider"

2.Comando Artisan basico

php artisan laramain:install-basic

Repetimos publicacion del vendor

Uso del Command y Query Bus

Para utilizar las clases CommandBus y QueryBus, asegúrate de incluir los siguientes namespaces en tu archivo:

use Pupadevs\Laramain\Shared\CQRS\Command\CommandBus;
use Pupadevs\Laramain\Shared\CQRS\Query\QueryBus;

Creando Comando personalizado

  • En la ubicacion App/Commands, crearemos nuestros commandos y sus respectivos manejadores
  • Para la creacion de un Comando , necesitamos implementar de la interfaz Command use Pupadevs\Laramain\Shared\CQRS\Command\CommandBus;
namespace App\Commands;

class CreateUserCommand implements Command
{
    public string $name;
    public string $email;
    public string $password;

    public function __construct(string $name, string $email, string $password)
    {
        $this->name = $name;
        $this->email = $email;
        $this->password = $password;
    }
}
  • Creando Manejador de comando -En la misma ubicación donde hemos creado nuestro Command, también debemos crear su Handler. ¡Importante! El nombre del Handler debe ser exactamente igual al del Command, pero con la palabra "Handler" al final. Por ejemplo:
namespace App\Commands;

use App\Commands\CreateUserCommand;
use App\Repositories\UserRepository;

class CreateUserCommandHandler
{
    protected $userRepository;

    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function handle(CreateUserCommand $command)
    {
        // Lógica para crear un usuario
        $this->userRepository->create([
            'name' => $command->name,
            'email' => $command->email,
            'password' => bcrypt($command->password),
        ]);
    }
}

Creando Query personalizada

  • En la ubicacion App/Querys, crearemos nuestros commandos y sus respectivos manejadores
  • Para la creacion de un Comando , necesitamos implementar la interface Query use Pupadevs\Laramain\Shared\CQRS\Query\QueryBus;
class CheckEmailQuery implements Query
{
   
    public Email $email;

    public function __construct( Email $email)
    {
      
        $this->email = $email;
     
    }

    public function getEmail(){
        return $this->email;
    }
}
  • Creando Manejador de Query -En la misma ubicación donde hemos creado nuestra Query, también debemos crear su Handler. ¡Importante! El nombre del Handler debe ser exactamente igual al de la Query, pero con la palabra "Handler" al final. Por ejemplo:
namespace App\Query;

use App\Queyr\CheckEmailQuery;
use App\Repositories\UserRepository;

class CheckEmailQueryHanlder
{
    protected $userRepository;

    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function handle(CheckEmailQuery $query)
    {
       return $this->userRepository->findEmail($query->toString());
    }
}

Luego, puedes instanciarlas en tu Servcio o controlador como se muestra a continuación:

Uso en un servicio de Aplicacion

class YourService
{
    protected CommandBus $command;
    protected QueryBus $query;

    public function __construct(CommandBus $commandBus, QueryBus $queryBus)
    {
        $this->command = $commandBus;
        $this->query = $queryBus;
    }

    public function someMethod($email)
    {
        $this->query->handle(new CheckEmailQuery(new Email($email)));
    }
}

Uso en un Controlador

Class SomeController{

    protected CommandBus $command;
    protected QueryBus $query;

    public function __construct(CommandBus $command, QueryBus $query)
    {
        $this->command = $commandBus;
        $this->query = $queryBus;
    } 

    public function showSomeThings(Request $request){
        $this->query->handle(new CheckEmailQuery($request->email));
        $this->command->execute(new CreateUserCommand($request->all()));
    }
}

Uso de la Interfaz StringValueObject y la Clase Identifier

Interfaz StringValueObject

La interfaz StringValueObject asegura que cualquier clase que la implemente debe ser capaz de convertirse a una representación de cadena, proporcionando métodos para manejar esta conversión.

Métodos de la Interfaz

interface StringValueObject
{
    public function toString(): string;

    public function __toString(): string;
}

Clase Identifier

La clase Identifier implementa la interfaz StringValueObject y representa un identificador único basado en UUID. Instanciación Para usar la clase Identifier, primero incluye el namespace correspondiente:

use Pupadevs\Laramain\Shared\YourNamespace\Identifier; 

Luego, puedes crear una instancia de la clase Identifier. Si no proporcionas un identificador, se generará uno automáticamente:

// Genera un nuevo identificador único (UUID)
$identifier = new Identifier();

Conversión a Cadena Para convertir el identificador a cadena de texto, puedes usar el método toString() o simplemente tratar la instancia como una cadena:

// Usando el método toString()
echo $identifier->toString(); // Imprime el UUID generado

Version 2.0.0

Nuevas funcionalidades

  • Nueva funcion intalacion basica
  • Se agregó la carpeta DTOs a la capa de App a la instalacion con parametros.
  • Se agregó la carpeta Middlewares y Requests a la capa de Infrastructure a la instalacion con parametros.
  • Se agregan EventProvider y DependencyProvider a la carpeta Shared para manejar evento y DIP

Licencia

Este proyecto está bajo la Licencia MIT.

Colaboración

Si deseas contribuir a Pupadevs\Laramain, por favor sigue estos pasos:

  1. Fork del repositorio: Crea un fork del repositorio en GitHub.
  2. Crea una nueva rama: Realiza tus cambios en una nueva rama utilizando el siguiente comando:
    git checkout -b nombre-de-la-rama