Slide 1

Slide 1 text

Getting started with event sourcing in Laravel

Slide 2

Slide 2 text

About me Freek Van der Herten Partner & developer at Spatie @freekmurze https://murze.be https://ohdear.app

Slide 3

Slide 3 text

Spatie Since 2003 Websites, applications and webshops Team 9 awesome human beings Specialisation Laravel, front-end development

Slide 4

Slide 4 text

Open Source 
 Software

Slide 5

Slide 5 text

We create a lot of it ± 200 packages on Packagist ± 2,000,000 downloads a month ± 30,000,000 total downloads All Postcardware!

Slide 6

Slide 6 text

Highlights Popular laravel-backup laravel-medialibrary laravel-permission New laravel-query-builder laravel-blade-x

Slide 7

Slide 7 text

https://spatie.be/open-source

Slide 8

Slide 8 text

https://spatie.be/open-source/postcards

Slide 9

Slide 9 text

Let's talk about event sourcing

Slide 10

Slide 10 text

Talk overview Theory Laravel Event Projector demo Eventsauce demo

Slide 11

Slide 11 text

Theory

Slide 12

Slide 12 text

Traditional application Write data in database An update means overwriting the old data The old data cannot be accessed anymore

Slide 13

Slide 13 text

APPLICATION DATABASE TABLE value X

Slide 14

Slide 14 text

APPLICATION DATABASE TABLE value X value Y

Slide 15

Slide 15 text

Event Sourced Application The application will fire off events Events will get written in a dedicated store Events are passed to consumers that create projections Aggregate, Aggregate Root...

Slide 16

Slide 16 text

APP EVENTS Event Event 1

Slide 17

Slide 17 text

APP EVENTS Event Event 1 Event 2

Slide 18

Slide 18 text

APP EVENTS Event Event 1 Event 2 Event 3

Slide 19

Slide 19 text

APP CONSUMER EVENTS PROJECTION Event Event 1 Event 2 Event 3

Slide 20

Slide 20 text

APP CONSUMER CONSUMER 2 EVENTS PROJECTION Event Event 1 Event 2 Event 3 ANOTHER PROJECTION

Slide 21

Slide 21 text

APP CONSUMER CONSUMER 2 EVENTS PROJECTION Event Event 1 Event 2 Event 3 ANOTHER PROJECTION

Slide 22

Slide 22 text

APP CONSUMER CONSUMER 2 EVENTS PROJECTION Event Event 1 Event 2 Event 3 Event 4 ANOTHER PROJECTION

Slide 23

Slide 23 text

Event Sourced Application Auditing requirements Extra reports needed Recording the unhappy path There is some setup required

Slide 24

Slide 24 text

Laravel 
 Event Projector

Slide 25

Slide 25 text

Laravel Event Projector Package made by Spatie It's not full event sourcing, it focuses on projections Beautifully integrated into Laravel Easy to get started with

Slide 26

Slide 26 text

https://docs.spatie.be/laravel-event-projector

Slide 27

Slide 27 text

Demo

Slide 28

Slide 28 text

Eventsauce

Slide 29

Slide 29 text

Eventsauce Package made by Frank De Jonge Focuses on aggregates Framework agnostic Separate Laravel bindings package available Very powerful, adds complexity

Slide 30

Slide 30 text

https://eventsauce.io/docs/

Slide 31

Slide 31 text

APP Subtract $1000

Slide 32

Slide 32 text

AGGREGATE ROOT REPOSITORY UUID PAYLOAD TIME APP Subtract $1000

Slide 33

Slide 33 text

AGGREGATE ROOT REPOSITORY UUID PAYLOAD TIME APP Subtract $1000 RETRIEVE Subtract $1000 AGGREGATE ROOT (empty)

Slide 34

Slide 34 text

AGGREGATE ROOT REPOSITORY ABC-123 Subtract 1000 11:12 AM UUID PAYLOAD TIME APP Subtract $1000 RETRIEVE Subtract $1000 AGGREGATE ROOT ACCOUNTS CONSUMER -$1000 (empty) PERSIST

Slide 35

Slide 35 text

AGGREGATE ROOT REPOSITORY ABC-123 Subtract 1000 11:12 AM UUID PAYLOAD TIME APP RETRIEVE Subtract $750 AGGREGATE ROOT ACCOUNTS -$1000 CONSUMER Subtract $750 Subtract $1000 PERSIST

Slide 36

Slide 36 text

AGGREGATE ROOT REPOSITORY ABC-123 Subtract 1000 11:12 AM ABC-124 Subtract 750 01:17 PM UUID PAYLOAD TIME APP RETRIEVE Subtract $750 AGGREGATE ROOT ACCOUNTS -$1750 CONSUMER Subtract $750 Subtract $1000 PERSIST

Slide 37

Slide 37 text

AGGREGATE ROOT REPOSITORY ABC-123 Subtract 1000 11:12 AM ABC-124 Subtract 750 01:17 PM UUID PAYLOAD TIME APP RETRIEVE AGGREGATE ROOT ACCOUNTS -$1750 CONSUMER Subtract $1250 Subtract $1000 Subtract $750 Subtract $1250 More Money Needed PERSIST

Slide 38

Slide 38 text

AGGREGATE ROOT REPOSITORY ABC-123 Subtract 1000 11:12 AM ABC-124 Subtract 750 01:17 PM ABC-125 Subtract 1250 05:51 PM ABC-126 More Money Needed 05:51 PM UUID PAYLOAD TIME ACCOUNTS APP CONSUMER CONSUMER 2 PROPOSED LOANS Subtract $1250 -$3000 RETRIEVE PERSIST Subtract $1000 Subtract $750 Subtract $1250 More Money Needed AGGREGATE ROOT

Slide 39

Slide 39 text

Demo

Slide 40

Slide 40 text

In closing

Slide 41

Slide 41 text

Summary Laravel Event Projector Easy to use package to get started with projections Hooks into Laravel's native events Replay capabilities No aggregates

Slide 42

Slide 42 text

Summary EventSauce Framework agnostic Support for aggregates, process modelling No replay capabilities out of the box https://github.com/spatie/laravel-eventsauce

Slide 43

Slide 43 text

Writes are harder, reads are easier

Slide 44

Slide 44 text

Event sourcing makes the easy things harder… …and the harder things easier — Frank De Jonge

Slide 45

Slide 45 text

Larabank https://github.com/spatie/larabank-traditional https://github.com/spatie/larabank-event-projector https://github.com/spatie/larabank-eventsauce

Slide 46

Slide 46 text

Resources https://kickstarter.engineering/event-sourcing-made-simple-4a2625113224 https://github.com/spatie/laravel-event-projector https://github.com/eventsaucephp/eventsauce https://github.com/prooph

Slide 47

Slide 47 text

Thank you! https://speakerdeck.com/freekmurze/event-sourcing-full-stack-brussels https://spatie.be/open-source https://murze.be https://ohdear.app