{"id":16078423,"url":"https://github.com/spiral-packages/cqrs","last_synced_at":"2025-03-17T17:30:30.077Z","repository":{"id":39633968,"uuid":"458506753","full_name":"spiral-packages/cqrs","owner":"spiral-packages","description":"(CQRS) Command/Query bus implementation for Spiral Framework","archived":false,"fork":false,"pushed_at":"2023-11-30T08:34:54.000Z","size":45,"stargazers_count":7,"open_issues_count":3,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-12T21:29:31.429Z","etag":null,"topics":["command-bus","cqrs","php","php8","query-bus","spiral","spiral-framework"],"latest_commit_sha":null,"homepage":"https://spiral.dev/docs/packages-cqrs","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spiral-packages.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-12T11:49:37.000Z","updated_at":"2025-01-10T09:57:06.000Z","dependencies_parsed_at":"2024-10-12T00:16:19.377Z","dependency_job_id":null,"html_url":"https://github.com/spiral-packages/cqrs","commit_stats":{"total_commits":17,"total_committers":3,"mean_commits":5.666666666666667,"dds":"0.47058823529411764","last_synced_commit":"edd4d94d5cf878ed02d65ba6182c4f0432076944"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":"spiral-packages/package-skeleton","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spiral-packages%2Fcqrs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spiral-packages%2Fcqrs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spiral-packages%2Fcqrs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spiral-packages%2Fcqrs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spiral-packages","download_url":"https://codeload.github.com/spiral-packages/cqrs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243871888,"owners_count":20361379,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["command-bus","cqrs","php","php8","query-bus","spiral","spiral-framework"],"created_at":"2024-10-09T10:12:27.890Z","updated_at":"2025-03-17T17:30:29.733Z","avatar_url":"https://github.com/spiral-packages.png","language":"PHP","readme":"# (CQRS) Command/Query bus implementation for Spiral Framework\n\n[![PHP](https://img.shields.io/packagist/php-v/spiral-packages/cqrs.svg?style=flat-square)](https://packagist.org/packages/spiral-packages/cqrs)\n[![Latest Version on Packagist](https://img.shields.io/packagist/v/spiral-packages/cqrs.svg?style=flat-square)](https://packagist.org/packages/spiral-packages/cqrs)\n[![Total Downloads](https://img.shields.io/packagist/dt/spiral-packages/cqrs.svg?style=flat-square)](https://packagist.org/packages/spiral-packages/cqrs)\n[![run-tests](https://github.com/spiral-packages/cqrs/actions/workflows/run-tests.yml/badge.svg)](https://github.com/spiral-packages/cqrs/actions/workflows/run-tests.yml)\n\nIt's a lightweight messaging facade. It allows you to define the API of your model with the help of messages.\n\n- Command messages describe actions your model can handle.\n- Query messages describe available information that can be fetched from your (read) model.\n\n## Requirements\n\nMake sure that your server is configured with following PHP version and extensions:\n\n- PHP 8.1+\n- Spiral framework 3.0+\n\n## Installation\n\nYou can install the package via composer:\n\n```bash\ncomposer require spiral-packages/cqrs\n```\n\nAfter package install you need to register bootloader from the package.\n\n```php\nprotected const LOAD = [\n    // ...\n    \\Spiral\\Cqrs\\Bootloader\\CqrsBootloader::class,\n];\n```\n\n\u003e Note: if you are using [`spiral-packages/discoverer`](https://github.com/spiral-packages/discoverer),\n\u003e you don't need to register bootloader by yourself.\n\n## Usage\n\nYou can also register command and query handlers via attributes\n\n### Commands\n\n#### Command definition\n\n```php\nclass StoreUser implements \\Spiral\\Cqrs\\CommandInterface\n{\n    public function __construct(\n        public Uuid $uuid,\n        public string $username,\n        public string $password,\n        public \\DateTimeImmutable $registeredAt,\n    ) {\n    }\n}\n```\n\n#### Command handler definition\n\nTo register command handler you just need to add attribute on method that should be invoked.\n\n```php\nclass StoreUserHandler\n{\n    public function __construct(\n        private EntityManagerInterface $entityManager\n    ) {\n\n    }\n\n    #[\\Spiral\\Cqrs\\Attribute\\CommandHandler]\n    public function __invoke(StoreUser $command)\n    {\n        $this-\u003eentityManager-\u003epersist(\n            new User(\n                $command-\u003euuid,\n                $command-\u003eusername,\n                $command-\u003epassword,\n                $command-\u003eregisteredAt\n            )\n        );\n\n        $this-\u003eentityManager-\u003erun();\n    }\n}\n```\n\n#### Dispatch command\n\n```php\nuse Ramsey\\Uuid\\Uuid;\n\nclass UserController\n{\n    public function store(UserStoreRequest $request, \\Spiral\\Cqrs\\CommandBusInterface $bus)\n    {\n        $bus-\u003edispatch(new StoreUser(\n           $uuid = Uuid::uuid4(),\n           $request-\u003egetUsername(),\n           $request-\u003egetPassword(),\n           new \\DateTimeImmutable()\n        ));\n\n        return $uuid;\n    }\n}\n```\n\n### Queries\n\n#### Query definition\n\n```php\nclass FindAllUsers implements \\Spiral\\Cqrs\\QueryInterface\n{\n    public function __construct(\n        public array $roles = []\n    ) {\n    }\n}\n```\n\n```php\nclass FindUserById implements \\Spiral\\Cqrs\\QueryInterface\n{\n    public function __construct(\n        public Uuid $uuid\n    ) {\n    }\n}\n```\n\n#### Query handler definition\n\n```php\nclass UsersQueries\n{\n    public function __construct(\n        private UserRepository $users\n    ) {\n    }\n\n    #[\\Spiral\\Cqrs\\Attribute\\QueryHandler]\n    public function findAll(FindAllUsers $query): UserCollection\n    {\n        $scope = [];\n        if ($query-\u003eroles !== []) {\n            $scope['roles'] = $query-\u003eroles\n        }\n\n        return new UserCollection(\n            $this-\u003eusers-\u003efindAll($scope)\n        );\n    }\n\n    #[\\Spiral\\Cqrs\\Attribute\\QueryHandler]\n    public function findById(FindUserById $query): UserResource\n    {\n        return new UserResource(\n            $this-\u003eusers-\u003efindByPK($query-\u003euuid)\n        );\n    }\n}\n```\n\n#### Dispatch queries\n\n```php\nuse Ramsey\\Uuid\\Uuid;\n\nclass UserController\n{\n    public function index(UserFilters $filters, \\Spiral\\Cqrs\\QueryBusInterface $bus)\n    {\n        return $bus-\u003eask(\n            new FindAllUsers($filters-\u003eroles())\n        )-\u003etoArray();\n    }\n\n    public function show(string $uuid, \\Spiral\\Cqrs\\QueryBusInterface $bus)\n    {\n        return $bus-\u003eask(\n            new FindUserById(Uuid::fromString($uuid))\n        )-\u003etoArray();\n    }\n}\n```\n\n## Testing\n\n```bash\ncomposer test\n```\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE) for more information.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspiral-packages%2Fcqrs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspiral-packages%2Fcqrs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspiral-packages%2Fcqrs/lists"}