1. Go to this page and download the library: Download xprt64/dudulina library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
xprt64 / dudulina example snippets
// immutable and Plain PHP Object (Value Object)
// No inheritance!
class DoSomethingImportantCommand implements Command
{
private $idOfTheAggregate;
private $someDataInTheCommand;
public function __construct($idOfTheAggregate, $someDataInTheCommand)
{
$this->idOfTheAggregate = $idOfTheAggregate;
$this->someDataInTheCommand = $someDataInTheCommand;
}
public function getAggregateId()
{
return $this->idOfTheAggregate;
}
public function getSomeDataInTheCommand()
{
return $this->someDataInTheCommand;
}
}
// immutable, simple object, no inheritance, minimum dependency
class SomethingImportantHappened implements Event
{
public function __construct($someDataInTheEvent)
{
$this->someDataInTheEvent = $someDataInTheEvent;
}
public function getSomeDataInTheEvent()
{
return $this->someDataInTheEvent;
}
}
class SomeHttpAction
{
public function getDoSomethingImportant(RequestInterface $request)
{
$idOfTheAggregate = $request->getParsedBody()['id'];
$someDataInTheCommand = $request->getParsedBody()['data'];
$this->commandDispatcher->dispatchCommand(new DoSomethingImportantCommand(
$idOfTheAggregate,
$someDataInTheCommand
));
return new JsonResponse([
'success' => 1,
]);
}
}
class OurAggregate
{
//....
public function handleDoSomethingImportant(DoSomethingImportantCommand $command)
{
if($this->ourStateDoesNotPermitThis()){
throw new \Exception("No no, it is not possible!");
}
yield new SomethingImportantHappened($command->getSomeDataInTheCommand());
}
public function applySomethingImportantHappened(SomethingImportantHappened $event, Metadata $metadata)
{
//Metadata is optional
$this->someNewState = $event->someDataInTheEvent;
}
}
class SomeReadModel
{
//...some database initialization, i.e. a MongoDB database injected in the constructor
public function onSomethingImportantHappened(SomethingImportantHappened $event, Metadata $metadata)
{
$this->database->getCollection('ourReadModel')->insertOne([
'_id' => $metadata->getAggregateId()
'someData' => $event->getSomeDataInTheEvent()
]);
}
//this method could be used by the UI to display the data
public function getSomeDataById($id)
{
$document = $this->database->getCollection('ourReadModel')->findOne([
'_id' => $metadata->getAggregateId()
]);
return $document ? $document['someData'] : null;
}
}