-
Notifications
You must be signed in to change notification settings - Fork 1
/
sample.php
110 lines (94 loc) · 2.69 KB
/
sample.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
namespace Foo\Bar;
use DateTime;
use Goodby\EventSourcing\Event;
use Goodby\EventSourcing\EventNotifiable;
use Goodby\EventSourcing\EventSerializer\JSONEventSerializer;
use Goodby\EventSourcing\EventStore\MySQLEventStore;
use Goodby\EventSourcing\EventStreamId;
use PDO;
require __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/goodby-assertion/Goodby/Assertion/Assert.php';
class ItemPurchased implements Event
{
private $eventVersion;
private $occurredOn;
private $itemId;
private $price;
public function __construct($itemId, $price)
{
$this->eventVersion = 1;
$this->occurredOn = time();
$this->itemId = $itemId;
$this->price = $price;
}
/**
* @return int
*/
public function eventVersion()
{
return $this->eventVersion;
}
/**
* @return \DateTime
*/
public function occurredOn()
{
return (new DateTime)->setTimestamp($this->occurredOn);
}
/**
* Must return a primitive key-value set which is serializable.
* @return mixed[]
*/
public function toContractualData()
{
return [
'eventVersion' => $this->eventVersion,
'occurredOn' => $this->occurredOn,
'itemId' => $this->itemId,
'price' => $this->price,
];
}
/**
* @param mixed[] $data
* @return Event
*/
public static function fromContractualData(array $data)
{
$self = new self($data['itemId'], $data['price']);
$self->eventVersion = $data['eventVersion'];
$self->occurredOn = $data['occurredOn'];
return $self;
}
}
class MySQLEventNotifiable implements EventNotifiable
{
/**
* @return void
*/
public function notifyEvents()
{
echo 'New events appended!!', PHP_EOL;
}
}
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$username = 'root';
$password = 'root';
$connection = new PDO($dsn, $username, $password, [
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, // NULL is available
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_AUTOCOMMIT => true,
]);
$serializer = new JSONEventSerializer();
$eventStore = new MySQLEventStore($connection, $serializer);
$eventStore->registerEventNotifiable(new MySQLEventNotifiable());
$connection->exec('TRUNCATE TABLE event_store');
$eventStreamId = new EventStreamId('foo');
$events = [
new ItemPurchased('item1234', 1000),
new ItemPurchased('item1234', 2000),
];
$eventStore->append($eventStreamId, $events);
$events = $eventStore->eventStreamSince($eventStreamId);
var_dump($events);