gpslab / specification-query
The simple infrastructure component for use a Doctrine specification as query in CQRS architecture
v1.0.0
2017-06-23 11:38 UTC
Requires
- php: >=5.5.0
- gpslab/cqrs: ~1.0
- happyr/doctrine-specification: ^0.7
Requires (Dev)
- phpunit/phpunit: ~4.8
- satooshi/php-coveralls: ^1.0
- scrutinizer/ocular: ~1.3
This package is auto-updated.
Last update: 2024-10-29 03:58:51 UTC
README
Doctrine Specification as query in CQRS architecture
The simple infrastructure component for use a Doctrine Specification as query in CQRS architecture.
Installation
Pretty simple with Composer, run:
composer require gpslab/specification-query
Usage
You can use Specifications as a simple query.
use GpsLab\Component\Query\Bus\HandlerLocatedQueryBus; use GpsLab\Component\Query\Handler\Locator\DirectBindingQueryHandlerLocator; use GpsLab\Component\Query\Specification\SpecificationQueryHandler; use GpsLab\Component\Query\Specification\ObviousSpecificationQuery; // register query handler in handler locator $locator = new DirectBindingQueryHandlerLocator(); $locator->registerHandler(ObviousSpecificationQuery::class, [new SpecificationQueryHandler($em), 'handleSpecification']); // create bus with query handler locator $bus = new HandlerLocatedQueryBus($locator); // specification for get contact with id = 123 $spec = Spec::eq('id', 123); // cache the result by 1 hour $modifier = Spec::cache(3600); // make specification query $query = new ObviousSpecificationQuery('AcmeDemo:Contact', $spec, $modifier); // get contact $contact = $query_bus->handle($query);
Custom query
You can create custom query for this case.
class ContactWithIdentityQuery implements SpecificationQuery { /** * @var int */ private $id; /** * @param int $id */ public function __construct($id) { $this->id = $id; } /** * @return string */ public function entity() { return 'AcmeDemo:Contact'; } /** * @return Specification */ public function spec() { return Spec::eq('id', $this->id); } /** * @return ResultModifier|null */ public function modifier() { return Spec::cache(3600); } }
And use it
use GpsLab\Component\Query\Bus\HandlerLocatedQueryBus; use GpsLab\Component\Query\Handler\Locator\DirectBindingQueryHandlerLocator; use GpsLab\Component\Query\Specification\SpecificationQueryHandler; use GpsLab\Component\Query\Specification\ObviousSpecificationQuery; // register query handler in handler locator $locator = new DirectBindingQueryHandlerLocator(); $locator->registerHandler(ContactWithIdentityQuery::class, [new SpecificationQueryHandler($em), 'handleSpecification']); // create bus with query handler locator $bus = new HandlerLocatedQueryBus($locator); // make specification query $query = new ContactWithIdentityQuery(123); // get contact $contact = $query_bus->handle($query);
License
This bundle is under the MIT license. See the complete license in the file: LICENSE