https://github.com/ho-nl/magento2-reachdigital_proopheventstore
Integration of the Prooph libraries with Magento 2
https://github.com/ho-nl/magento2-reachdigital_proopheventstore
prooph
Last synced: 3 months ago
JSON representation
Integration of the Prooph libraries with Magento 2
- Host: GitHub
- URL: https://github.com/ho-nl/magento2-reachdigital_proopheventstore
- Owner: ho-nl
- Created: 2018-02-20T15:54:33.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2021-04-29T21:32:29.000Z (about 4 years ago)
- Last Synced: 2025-01-24T21:28:37.509Z (5 months ago)
- Topics: prooph
- Language: PHP
- Homepage:
- Size: 119 KB
- Stars: 3
- Watchers: 8
- Forks: 1
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Magento 2 Prooph EventStore
Integration with Prooph software and Magento 2's DI.
Reduce boilerplate in setting up your project.## Installation
https://github.com/prolic/fpp/blob/master/docs/PhpStorm-Integration.md
https://github.com/ho-nl/docs-internal/issues/22## Modules build with ES
https://github.com/ho-nl/magento2-ReachDigital_Subscription
https://github.com/ho-nl/magento2-ReachDigital_ProophJira
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES## What is ES?
https://www.youtube.com/watch?v=B6XUEoZlsWk
http://getprooph.org/
http://docs.getprooph.org/tutorial/
https://github.com/prooph/proophessor-do## When to use ES?
- When you are creating new entities
- When you are creating new Commands
- When you want to have a high development velocity## Building your own ES based module
For a full example, take a look at [ReachDigital_TransferOrdersES](https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES),
which implements all the patterns discussed here. [ReachDigital_Subscription](https://github.com/ho-nl/magento2-ReachDigital_Subscription)
is actually in production so everything is more stable out, but doesn't follow all patterns described here and therefor
is a bit messy.The Module we are going to build will be split up in multiple logical Magento Modules. We define the following sections:
- Api
- Command+Event Implementation
- Query Implementation
- Frontend UI
- Backend UI### Api Module
#### Field Types, Commands and events with FPP
Generate your classes with [fpp](https://github.com/prolic/fpp) (there is a PHPStorm file watcher for fast development).
Logical Magento Module: https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/tree/master/TransferOrdersESApi
Domain Model: https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/blob/master/TransferOrdersESApi/etc/domain.fpp
Generated Code: https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/tree/master/TransferOrdersESApi/ModelDomain Model: https://github.com/ho-nl/magento2-ReachDigital_Subscription/blob/master/src/Model/Domain.fpp
To create your own Domain model, understand this http://docs.getprooph.org/tutorial/why_event_sourcing.html
#### Your Model (AggregateRoot)
Create your Domain Model (AggregateRoot). Because this model actually contains business logic, this class can't be
auto generated. This is a bit of chore, but writing all your commands, events, fields down in the class validates your
domain model.This class is a leaky abstraction: This class actually defines the business logic required and belongs in the domain
model, but it extends AggregateRoot which is an implementation specific thing.. Therefor it is a bit of odd class here.Examples:
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/blob/master/TransferOrdersESApi/Model/Transfer/Transfer.php
https://github.com/ho-nl/magento2-ReachDigital_Subscription/blob/master/src/Model/Subscription/Subscription.php
https://github.com/ho-nl/magento2-ReachDigital_Subscription/blob/master/src/Model/ProductPlan/ProductPlan.php#### GetTransferInterface + SaveTransferInterface
Since we dont want any save/load logic in this module, we're defining the interfaces here.
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/blob/ab296875bce658196775b911edb9892e492a6012/TransferOrdersESApi/Model/Transfer/GetTransferInterface.php
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/blob/ab296875bce658196775b911edb9892e492a6012/TransferOrdersESApi/Model/Transfer/SaveTransferInterface.php## Event Store setup (chore)
We're now implementing the Command side of CQRS (Command Query Responsibility Seggegation). This means we need to
implement the GetTransferInterface, SaveTransferInterface.Create a second module (composer.json PSR4, registration.php, module.xml) and enable the module via php bin/magento
module enable, make sure it works.Create a event store table by creating a SchemaPatch:
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/blob/ab296875bce658196775b911edb9892e492a6012/TransferOrdersES/Setup/Patch/Schema/CreateEventStore.phpTo access the information of the event store, use the [AggregateRepository](http://docs.getprooph.org/event-sourcing/repositories.html#4-2-6) to fetch the information.
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/blob/ab296875bce658196775b911edb9892e492a6012/TransferOrdersES/Model/Transfer/GetTransfer.php
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/blob/ab296875bce658196775b911edb9892e492a6012/TransferOrdersES/Model/Transfer/SaveTransfer.php
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/blob/ab296875bce658196775b911edb9892e492a6012/TransferOrdersES/etc/di.xml## Command Handlers
Now onto the meat of the application, making everything work. First we create handlers (with tests for the application).
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/tree/7512a2ad62f297cdb31f96e84161dab884867e29/TransferOrdersES/Model/Transfer/Handler
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/blob/7512a2ad62f297cdb31f96e84161dab884867e29/TransferOrdersES/etc/di.xml#L10-L27
https://github.com/ho-nl/magento2-ReachDigital-TransferOrdersES/tree/7512a2ad62f297cdb31f96e84161dab884867e29/TransferOrdersES/Test/Integration/Model/HandlerIn the examples I first focus on the internals of the application, and don't bother with stuff that interacts with the
rest of Magento. This way I can focus on this part of the application, which keeps everything simple.### Interaction with the rest of the system
A feature usually doesn't exist in a vacuum, so we need to integrate it with the rest of Magento.## Admin UI
- Controllers
- UI## Usage
To use the Prooph components in your application, use:
https://github.com/ho-nl/magento2-ProophEventStore/blob/master/src/ProophEventStoreContext.php```php
$this->proophEventStoreContext->commandBus()->dispatch($command);
$this->proophEventStoreContext->eventBus()->dispatch($event);
$this->proophEventStoreContext->queryBus()->dispatch($query)->then(function($result){
//do something with $result
});
```### Adding commands
```xml
ReachDigital\MyModule\Model\ProductPlan\Handler\MyCommandHandler
```
### Adding queries
```xml
ReachDigital\Subscription\Model\Subscription\Handler\GetOrderScheduleHandler
ReachDigital\Subscription\Model\Subscription\Handler\GetOrderHistoryHandler
```
### Adding AggregateRoot Collections
```xml
ReachDigital\Subscription\Model\Subscription\Subscription
subscription
```