Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
DIVIDEANDCONQUER
2 YEARS OF CQRS IN PRODUCTION
24. SEPTEMBER • PHP DEVELOPER DAY 2016 • DRESDEN
HOLGER WOLTERSDORF
ORGA-MITGLIED DER
phpind.de
HOLGER WOLTERSDORF
CIO • FATHER • HUSBAND • PHP DEV
github.com/hollodotme
github.com/PHPinDD
@...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
KLEINE ZEITREISE
3
2014 20162015
MVC vs.
CQRS
EINFLÜ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
4
MVC vs. CQRS
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
5
MODEL
VIEW
CONTROLLER
(MVC)
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
6
๏ WEB-MVC FAQ [fʌk]
๏ Wie viel Logik ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
7
(eine nicht gänzlich unbekannte PHP B...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
8
๏ DAS MVC PATTERN
VIEW VIEW
CONTROLLE...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
9
๏ DAS MVC PATTERN
VIEW VIEW
CONTROLLE...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
10
HTTP ZIEHT EINE
NATÜRLICHE GRENZE
ZW...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
11
DAS MVC-PATTERN LÖST EIN
PROBLEM, DA...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
12
๏ NEUE FRAGEN
๏ Warum nicht Lesen un...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
13
COMMAND
QUERY
RESPONSIBILITY
SEGREGA...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
14
๏ DAS CQRS PATTERN (respektiert HTTP...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
15
๏ DAS CQRS PATTERN (respektiert HTTP...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
16
๏ CQRS REGELN
๏ Ein POST-Request lie...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
17
MOMENT MAL …
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
18
WAS IST DER UNTERSCHIED
ZWISCHEN EIN...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
19
๏ REST-API == WEBSITE
๏ REST-API änd...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
20
๏ REST-API == WEBSITE
๏ Website ände...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
21
๏ REST-API != WEBSITE
๏ Website hat ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
22
SUPRISE, SUPRISE!
GUTE REST-APIs
SET...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
MVC vs. CQRS
23
OKAY.
UND WIE IMPLEMENTIERT
MAN DAS ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
24
EINFLÜSSE
&
GRUNDSÄTZE
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
25
https://37signals.com/mani...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
26
๏ REWORK
๏ Schaffe Overhead...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
27
๏ CLEAN CODE
๏ Namen und L...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
28
๏ GOOGLE GROUP DDD IN PHP
...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
29
UNSERE 4 GRUNDSÄTZE
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
30
NO MAGIC
$product = Rage::...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
31
WRITE MORE - DO LESS
๏ Spa...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
32
USE (plain) PHP
๏ Lerne PH...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
33
THINK ABOUT THE NEXT DEV
๏...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
EINFLÜSSE & GRUNDSÄTZE
34
NAMENS-KONVENTION
interfac...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
35
„Wir brauchen einen Namen!“
-
„Ja, irgendwas cool...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
36
ICEHAWK 1.0
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
37
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
38
๏ WAS IST EIN FRAMEWORK?
๏ Session- &...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
39
class IceHawk
{
public function __con...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
40
REQUESTS & RESPONSES
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
41
class RequestInfo {}
class GetRequest...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
42
class Page {}
class NotFound {}
class...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
43
DELEGATION & KONFIGURATION
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
44
class IceHawkDelegate
{
public functi...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
45
class IceHawkConfig
{
public function...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
46
class UriResolver
{
public function r...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
47
class UriRewriter
{
public function r...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
48
class SessionRegistry {}
class FormDa...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
49
RELEASED 30.05.2015
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
50
PAGE 1 PAGE 2
PostRequestHandler MYSQ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
51
PAGE 1 PAGE 2
PostRequestHandler MYSQ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
52
PAGE 1 PAGE 2
PostRequestHandler MYSQ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
53
SCHNELLE AUTOS HABEN
ZWEI ENDROHRE
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
54
PAGE 1 PAGE 2
PostRequestHandler MYSQ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
55
ETWAS ÜBER 1 JAHR UND…
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
56
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 1.0
57
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
58
PITFALLS
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
PITFALLS
59
๏ OPT-IN E-MAILS
๏ RETURN-URLs (z.B. EXT...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
PITFALLS
60
๏ OPT-IN E-MAILS
๏ Kein POST-Request mög...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
PITFALLS
61
๏ RETURN-URLs
๏ Kommen i.d.R. via GET-Re...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
PITFALLS
62
๏ AJAX
๏ REDIRECTS AUF GET FUNKTIONIEREN...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
PITFALLS
63
๏ CSRF-TOKEN
๏ Gehört die Session zum Ap...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
PITFALLS
64
๏ UNVOLLSTÄNDIGE READ/WRITE TRENNUNG
๏ T...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
PITFALLS
65
๏ UNFLEXIBLES ZUWEISEN VON REQUEST-HANDL...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
PITFALLS
66
๏ DEFAULT-ROUTING
๏ Handler waren oft üb...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
PITFALLS
67
๏ VERLETZUNG DES SOC-PRINZIPS
๏ Session-...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
68
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
69
REFACTORING
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
70
ICEHAWK 2.0
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 2.0
71
public function getReadRoutes()
{
ret...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 2.0
72
class FinalReadResponder
{
public fun...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 2.0
73
class InitializingIceHawkEvent {}
cla...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 2.0
74
๏ WEITERE "FEATURES"
๏ Unterstützung ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
ICEHAWK 2.0
75
๏ NEUE PACKAGES
๏ CSRF-Token Support ...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
76
ICEHAWK
FORMS
SESSION
PUBSUB
COMING SOON
EVENTSTO...
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
77
BUILD PASSING COVERAGE 100% LICENSE MIT
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
78
github.com/icehawk
FRAGEN?
phpind.de
VIELEN DANK!
github.com/hollodotme
github.com/PHPinDD
@hollodotme / @phpindd
fortuneglobe.com
www.phpug-dresden....
DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF
LINKS / REFERENCES
81
๏ MVC-Pattern: http://martinfo...
Upcoming SlideShare
Loading in …5
×

Divide and Conquer - 2 Years of CQRS in Production

485 views

Published on

“The MVC pattern solves a problem, that does not exist in the web.” - These few words and some scribbles on the whiteboard has a whole development ideology
torn apart in seconds. Mhh, aha, Command Query Responsibility Segregation - Sounds good!
And how does one implement this?
This session tells the story about the genesis of a PHP micro-framework respecting CQRS,
the rethinking of its developers, two years of production experience and the learnings on the
road to version 2.0.

Published in: Software
  • Be the first to comment

  • Be the first to like this

Divide and Conquer - 2 Years of CQRS in Production

  1. 1. DIVIDEANDCONQUER 2 YEARS OF CQRS IN PRODUCTION 24. SEPTEMBER • PHP DEVELOPER DAY 2016 • DRESDEN HOLGER WOLTERSDORF
  2. 2. ORGA-MITGLIED DER phpind.de HOLGER WOLTERSDORF CIO • FATHER • HUSBAND • PHP DEV github.com/hollodotme github.com/PHPinDD @hollodotme @phpindd
  3. 3. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF KLEINE ZEITREISE 3 2014 20162015 MVC vs. CQRS EINFLÜSSE & GRUNDSÄTZE IceHawk 1.0 IceHawk 2.0 Pitfalls
  4. 4. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 4 MVC vs. CQRS
  5. 5. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 5 MODEL VIEW CONTROLLER (MVC)
  6. 6. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 6 ๏ WEB-MVC FAQ [fʌk] ๏ Wie viel Logik gehört ins Model? ๏ Ist das Template meine View? ๏ Was kontrolliert ein Controller? ๏ … und was sind eigentlich Helper?
  7. 7. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 7 (eine nicht gänzlich unbekannte PHP Beratungsfirma)
  8. 8. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 8 ๏ DAS MVC PATTERN VIEW VIEW CONTROLLER MODEL BENUTZER EINGABE MODIFIZIERT AKTUALISIERT
  9. 9. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 9 ๏ DAS MVC PATTERN VIEW VIEW CONTROLLER MODEL BENUTZER EINGABE MODIFIZIERT AKTUALISIERT !
  10. 10. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 10 HTTP ZIEHT EINE NATÜRLICHE GRENZE ZWISCHEN SERVER UND CLIENT (…ja, ja Web-Sockets)
  11. 11. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 11 DAS MVC-PATTERN LÖST EIN PROBLEM, DAS ES IM WEB NICHT GIBT.
  12. 12. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 12 ๏ NEUE FRAGEN ๏ Warum nicht Lesen und Schreiben trennen? ๏ Wird ein Request kontrolliert oder behandelt? ๏ Wir liefern doch Seiten aus, warum gibt es keine Klasse, die Page heißt? ๏ Sollten Schreibvorgänge Ausgabe produzieren? ๏ Was ist ein Framework?
  13. 13. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 13 COMMAND QUERY RESPONSIBILITY SEGREGATION (CQRS)
  14. 14. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 14 ๏ DAS CQRS PATTERN (respektiert HTTP) PAGE 1 PAGE 2 REQUESTHANDLER APP STATE BENUTZER EINGABE MODIFIZIERT VORBEREITENPOST CLIENT / BROWSER REDIRECT ZU PAGE 2 GET GET
  15. 15. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 15 ๏ DAS CQRS PATTERN (respektiert HTTP) PAGE 1 PAGE 2 REQUESTHANDLER APP STATE BENUTZER EINGABE MODIFIZIERT VORBEREITENPOST CLIENT / BROWSER REDIRECT ZU PAGE 2 GET GET
  16. 16. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 16 ๏ CQRS REGELN ๏ Ein POST-Request liefert keinen Content aus ๏ Ein POST-Request kann den App-Zustand ändern ๏ Ein POST-Request antwortet mit einem Redirect ๏ Ein GET-Request liefert Content aus ๏ Ein GET-Request darf nicht den App-Zustand ändern
  17. 17. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 17 MOMENT MAL …
  18. 18. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 18 WAS IST DER UNTERSCHIED ZWISCHEN EINER (GUTEN) REST-API UND EINER WEBSITE?
  19. 19. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 19 ๏ REST-API == WEBSITE ๏ REST-API ändert Ressourcen durch Schreibbefehle (POST / PUT / PATCH / DELETE) ๏ REST-API verweist auf geänderte Ressourcen 
 (z.B. durch HATEOAS*-Tags) ๏ REST-API liefert Ressourcen im aktuellen Zustand durch Leseanfragen (GET) ๏ REST-API liefert Information über das Vorhandensein von Ressourcen und möglichen Aktionen (HEAD / OPTIONS) * HATEOAS = Hypermedia As The Engine Of Application State
  20. 20. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 20 ๏ REST-API == WEBSITE ๏ Website ändert den App-State durch Schreibbefehle (POST [/ PUT / PATCH / DELETE]) ๏ Website verweist auf geänderte Seiten 
 (REDIRECT) ๏ Website liefert Seiten im aktuellen Zustand durch Leseanfragen (GET) ๏ Website liefert Information über das Vorhandensein von Seiten und möglichen Aktionen 
 (HEAD / OPTIONS)
  21. 21. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 21 ๏ REST-API != WEBSITE ๏ Website hat einen "flüchtigen" Zustand (Session) ๏ Website liefert HTML statt XML/JSON/etc.
  22. 22. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 22 SUPRISE, SUPRISE! GUTE REST-APIs SETZEN AUF CQRS
  23. 23. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF MVC vs. CQRS 23 OKAY. UND WIE IMPLEMENTIERT MAN DAS JETZT?
  24. 24. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 24 EINFLÜSSE & GRUNDSÄTZE
  25. 25. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 25 https://37signals.com/manifesto Google Group DDDinPHP http://DDDinPHP.org Gestartet von Mathias Verraes
  26. 26. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 26 ๏ REWORK ๏ Schaffe Overhead ab ๏ Mach es selbst, bis es nicht mehr geht ๏ Entwickle Software für dein Business ๏ Sei konsequent und ehrlich ๏ Mach es so einfach wie möglich
  27. 27. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 27 ๏ CLEAN CODE ๏ Namen und Lesbarkeit sind wichtig ๏ Inline-Kommentare sind redundanter Müll ๏ Kohäsion in Klassen ๏ SOLID Prinzipien ๏ Richtig testen & stetiges Refactoring
  28. 28. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 28 ๏ GOOGLE GROUP DDD IN PHP ๏ Konvention für Interface-, Class- und Trait-Namen ๏ Domains & Subdomains ๏ Commands & Queries ๏ Aggregates, Entities & Value Objects ๏ Event Sourcing für besseres Verständnis von CQRS
  29. 29. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 29 UNSERE 4 GRUNDSÄTZE
  30. 30. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 30 NO MAGIC $product = Rage::getModel('catalog/product'); # vs. $product = new CatalogProduct();
  31. 31. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 31 WRITE MORE - DO LESS ๏ Spalte Zuständigkeiten in (viele) Klassen auf ๏ Schreibe kurze & aussagekräftige Methoden ๏ Benutze Interfaces, Value-Objects und Type-Hints ๏ Teile keinen Business-Code in mehreren Projekten
  32. 32. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 32 USE (plain) PHP ๏ Lerne PHPs Funktionsumfang zu nutzen ๏ Vermeide Drittanbieter-Libraries ๏ Verstehe das Problem - Löse es selbst
  33. 33. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 33 THINK ABOUT THE NEXT DEV ๏ Schreibe unmissverständlichen, weisenden Code ๏ Vergebe sprechende (auch lange) Namen ๏ Schreibe (vollständige) Tests
  34. 34. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF EINFLÜSSE & GRUNDSÄTZE 34 NAMENS-KONVENTION interface LogsActivity {} class ActivityLogger {} trait ActivityLogging {} class ActivityLogger implements LogsActivity { use ActivityLogging; }
  35. 35. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 35 „Wir brauchen einen Namen!“ - „Ja, irgendwas cooles schnelles!“
  36. 36. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 36 ICEHAWK 1.0
  37. 37. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 37
  38. 38. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 38 ๏ WAS IST EIN FRAMEWORK? ๏ Session- & Error-Handling initialisieren ๏ URIs auflösen & umschreiben ๏ Lese-Request-Daten weiter reichen ๏ Schreib-Request-Daten weiter reichen ๏ Requests behandeln ๏ Seiten ausliefern & Umleiten ๏ Finale Fehler-Behandlung (für 404 / 500 Seiten)
  39. 39. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 39 class IceHawk { public function __construct( $config, $delegate ) public function init() {} public function handleRequest() {} }
  40. 40. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 40 REQUESTS & RESPONSES
  41. 41. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 41 class RequestInfo {} class GetRequest {} abstract class GetRequestHandler {} class PostRequest {} abstract class PostRequestHandler {} REQUEST-VERARBEITUNG
  42. 42. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 42 class Page {} class NotFound {} class InternalServerError {} class Redirect {} RESPONSES
  43. 43. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 43 DELEGATION & KONFIGURATION
  44. 44. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 44 class IceHawkDelegate { public function setUpSessionHandling() {} public function setUpErrorHandling() {} public function handleUncaughtException( Exception $exception ) {} } DELEGATION
  45. 45. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 45 class IceHawkConfig { public function getRequestInfo() {} public function getUriResolver() {} public function getUriRewriter() {} public function getDomainNamespace() {} } KONFIGURATION
  46. 46. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 46 class UriResolver { public function resolveUri( RequestInfo $requestInfo ) { # Löse die URI hier auf # einen RequestHandler auf return new UriComponents( 'Products', 'ShowGallery' ); } }
  47. 47. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 47 class UriRewriter { public function rewriteUri( RequestInfo $requestInfo ) { # Schreibe die URI hier um (new Redirect('/phpday2016')) ->respond(); } }
  48. 48. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 48 class SessionRegistry {} class FormData {} class Command {} class Query {} class IceHawkWasInitializedEvent {} class HandlingRequestEvent {} class RequestWasHandledEvent {} UND…
  49. 49. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 49 RELEASED 30.05.2015
  50. 50. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 50 PAGE 1 PAGE 2 PostRequestHandler MYSQL BENUTZER EINGABE COMMAND QUERYPOST CLIENT / BROWSER REDIRECT GET GET GetRequestHandler GetRequestHandler
  51. 51. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 51 PAGE 1 PAGE 2 PostRequestHandler MYSQL BENUTZER EINGABE COMMAND QUERYPOST CLIENT / BROWSER REDIRECT GET GET GetRequestHandler GetRequestHandler
  52. 52. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 52 PAGE 1 PAGE 2 PostRequestHandler MYSQL BENUTZER EINGABE COMMAND QUERYPOST CLIENT / BROWSER REDIRECT GET GET GetRequestHandler GetRequestHandler
  53. 53. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 53 SCHNELLE AUTOS HABEN ZWEI ENDROHRE
  54. 54. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 54 PAGE 1 PAGE 2 PostRequestHandler MYSQL BENUTZER EINGABE COMMAND QUERYPOST CLIENT / BROWSER REDIRECT GET GET GetRequestHandler GetRequestHandler
  55. 55. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 55 ETWAS ÜBER 1 JAHR UND…
  56. 56. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 56
  57. 57. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 1.0 57
  58. 58. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 58 PITFALLS
  59. 59. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF PITFALLS 59 ๏ OPT-IN E-MAILS ๏ RETURN-URLs (z.B. EXTERNE BEZAHLSYSTEM) ๏ AJAX ๏ CSRF TOKENS ๏ UNVOLLSTÄNDIGE READ/WRITE TRENNUNG ๏ UNFLEXIBLES ZUWEISEN VON REQUEST-HANDLERN
 …WEIL MAGIC ๏ DEFAULT-ROUTING ๏ VERLETZUNG DES SOC-PRINZIPS
  60. 60. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF PITFALLS 60 ๏ OPT-IN E-MAILS ๏ Kein POST-Request möglich ๏ Option 1: Erneut ein Formular anzeigen ๏ Option 2: Die State-Änderung via GET-Request zulassen + REDIRECT
  61. 61. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF PITFALLS 61 ๏ RETURN-URLs ๏ Kommen i.d.R. via GET-Request zurück ๏ Lösung: Die State-Änderung via GET-Request zulassen + REDIRECT
  62. 62. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF PITFALLS 62 ๏ AJAX ๏ REDIRECTS AUF GET FUNKTIONIEREN AUCH 
 NACH POST-XHR ๏ ALLES GUT
  63. 63. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF PITFALLS 63 ๏ CSRF-TOKEN ๏ Gehört die Session zum App-State? ๏ Lösung: Nein. Die Session darf auf bei GET- Requests verändert werden.
  64. 64. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF PITFALLS 64 ๏ UNVOLLSTÄNDIGE READ/WRITE TRENNUNG ๏ Trennung erfolgte erst nach dem Resolving ๏ Events unterschieden nicht nach Read/Write ๏ Finale Fehlerbehandlung unterschied nicht nach Read/Write
  65. 65. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF PITFALLS 65 ๏ UNFLEXIBLES ZUWEISEN VON REQUEST-HANDLERN
 …WEIL MAGIC ๏ Suchpfad von RequestHandlern war je Projekt fix ๏ Beim Resolving war nicht ersichtlich, ob auf einen Read/Write Handler aufgelöst wurde
  66. 66. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF PITFALLS 66 ๏ DEFAULT-ROUTING ๏ Handler waren oft über 2 URIs erreichbar ๏ Lösung: Default-Routing abschaffen.
  67. 67. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF PITFALLS 67 ๏ VERLETZUNG DES SOC-PRINZIPS ๏ Session-Wrapper gehörte nicht ins Framework ๏ FormData gehörte nicht ins Framework ๏ Command / Query gehörten nicht ins Framework
  68. 68. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 68
  69. 69. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 69 REFACTORING
  70. 70. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 70 ICEHAWK 2.0
  71. 71. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 2.0 71 public function getReadRoutes() { return [ new ReadRoute( new Literal('/products/gallery'), new ProductGalleryRequestHandler() ), #... ]; } NO MAGIC, REALLY
  72. 72. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 2.0 72 class FinalReadResponder { public function handleUncaughtException( Throwable $throwable, ProvidesReadRequestData $request ); } FINAL RESPONDING R/W
  73. 73. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 2.0 73 class InitializingIceHawkEvent {} class IceHawkWasInitializedEvent {} class HandlingReadRequestEvent {} class ReadRequestWasHandledEvent {} class HandlingWriteRequestEvent {} class WriteRequestWasHandledEvent {} EVENTS R/W
  74. 74. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 2.0 74 ๏ WEITERE "FEATURES" ๏ Unterstützung aller HTTP-Methoden ๏ Interfaces definieren die erlaubten 
 HTTP-Methoden ๏ Auto-Responding auf OPTIONS-Request ๏ "Traitful" Config (Defaults via Traits) ๏ Kein Default-Routing mehr ๏ Literal, RegExp und NamedRegExp URI-Patterns
  75. 75. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF ICEHAWK 2.0 75 ๏ NEUE PACKAGES ๏ CSRF-Token Support und Feedback (Forms) ๏ Session Data Mapping (Session) ๏ Messaging (PubSub)
  76. 76. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 76 ICEHAWK FORMS SESSION PUBSUB COMING SOON EVENTSTORE
  77. 77. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 77 BUILD PASSING COVERAGE 100% LICENSE MIT
  78. 78. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF 78 github.com/icehawk
  79. 79. FRAGEN?
  80. 80. phpind.de VIELEN DANK! github.com/hollodotme github.com/PHPinDD @hollodotme / @phpindd fortuneglobe.com www.phpug-dresden.org @phpugdd HOLGER WOLTERSDORF https://joind.in/talk/f5095 slides available on slideshare FEEDBACK WELCOME github.com/icehawk
  81. 81. DIVIDE AND CONQUER • 2 YEARS OF CQRS IN PRODUCTION HOLGER WOLTERSDORF LINKS / REFERENCES 81 ๏ MVC-Pattern: http://martinfowler.com/eaaDev/uiArchs.html ๏ CQRS-Pattern: http://martinfowler.com/bliki/CQRS.html ๏ Rework by David Heinemeier Hansson: http://amzn.to/2cWOwxQ ๏ CleanCode by Robert C. Martin: http://amzn.to/2dthxQn ๏ Google-Group DDDinPHP: https://groups.google.com/forum/#!forum/dddinphp ๏ IceHawk Framework on GitHub: https://github.com/icehawk

×