Aller au contenu principal
Version: 5.x

🙅🏽‍♂️ CQRS

CQRS (ségrégation des responsabilités des requêtes de commande). C'est un modèle que j'ai entendu pour la première fois décrit par Greg Young. Au cœur se trouve l’idée selon laquelle vous pouvez utiliser un modèle différent pour mettre à jour les informations que celui que vous utilisez pour lire les informations. Dans certaines situations, cette séparation peut être utile, mais sachez que pour la plupart des systèmes, CQRS ajoute une complexité risquée.

Pour plus d'information

Install​

Le package utilise php >= 8.1

composer require bowphp/cqrs

Help​

Tout d’abord, créez l’exemple de commande:

use Bow\CQRS\Command\CommandInterface;

class CreateUserCommand implements CommandInterface
{
public function __construct(
public string $username,
public string $email
) {}
}

Créez le gestionnaire ici :

use Bow\CQRS\Command\CommandHandlerInterface;

class CreateUserCommandHandler implements CommandHandlerInterface
{
public function __construct(public UserService $userService) {}

public function process(CommandInterface $command): mixed
{
if ($this->userService->exists($command->email)) {
throw new UserServiceException(
"The user already exists"
);
}

return $this->userService->create([
"username" => $command->username,
"email" => $command->email
]);
}
}

Ajouter une commande au registre dans App\Configurations\ApplicationConfiguration::class:

use Bow\CQRS\Registration as CQRSRegistration;

public function run()
{
CQRSRegistration::commands([
CreateUserCommand::class => CreateUserCommandHandler::class
]);
}

Exécuter la commande dans le contrôleur:

namespace App\Controllers;

use App\Controllers\Controller;
use App\Commands\CreateUserCommand;

class UserController extends Controller
{
public function __construct(private CommandBus $commandBus) {}

public function __invoke(Request $request)
{
$payload = $request->only(['username', 'email']);

$command = new CreateUserCommand(
$payload['username'],
$payload['email']
);

$result = $this->commandBus->execute($command);

return redirect()
->back()
->withFlash("message", "User created");
}
}

Mettre un nouvel itinéraire :

$app->post("/users/create", UserController::class);

Il manque quelque chose ?

Si vous rencontrez des problèmes avec la documentation ou si vous avez des suggestions pour améliorer la documentation ou le projet en général, veuillez déposer une issue pour nous, ou envoyer un tweet mentionnant le compte Twitter @bowframework ou sur directement sur le github.