Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Avoiding the mud - Symfony Live London

Richard Miller
September 21, 2013

Avoiding the mud - Symfony Live London

Richard Miller

September 21, 2013
Tweet

More Decks by Richard Miller

Other Decks in Technology

Transcript

  1. AVOIDING THE MUD
    by Richard Miller
    http://www.flickr.com/photos/burge5000/22568539/

    View Slide

  2. @mr_r_miller
    http://www.richardmiller.co.uk

    View Slide

  3. http://www.flickr.com/photos/brostad/8583990904

    View Slide

  4. http://www.flickr.com/photos/dominik99/384027019

    View Slide

  5. http://www.flickr.com/photos/jasmeet/2158002974

    View Slide

  6. Bundles For Everything?
    http://www.flickr.com/photos/jarkel/2288176

    View Slide

  7. Separate Domain Model From
    Bundles
    http://www.flickr.com/photos/[email protected]/3705814710

    View Slide

  8. HumanResourcesBundle

    View Slide

  9. HumanResourcesBundle HumanResources

    View Slide

  10. HumanResourcesBundle HumanResources

    View Slide

  11. http://www.flickr.com/photos/[email protected]/3040936355
    Enough?

    View Slide

  12. Still Tightly Coupled

    View Slide

  13. AbsenceEntity
    Request
    Absence
    Form
    Cancel
    Absence
    Form
    Approve
    Absence
    Form
    Change
    Absence
    Type
    Form

    View Slide

  14. Sensio\HumanResources\Absence\AbsenceEntity:
    properties:
    reason:
    - NotBlank: { groups: [cancellation] }
    - Length: { max: 300, groups: [cancellation] }

    View Slide

  15. AbsenceEntity
    Request
    Absence
    Form
    Cancel
    Absence
    Form
    Approve
    Absence
    Form
    Change
    Absence
    Type
    Form
    Request
    Absence
    Command
    Cancel
    Absence
    Command
    Approve
    Absence
    Command
    Change
    Absence
    Type
    Command

    View Slide

  16. What About Templates?

    View Slide

  17. AbsenceEntity
    upcoming
    .html
    .twig
    details
    .html
    .twig
    calendar
    .html
    .twig
    unapproved
    .html
    .twig

    View Slide

  18. {% if absence.endDate < date() %}
    past
    {% else %}
    absence.status
    {% endif %}
    getDisplayStatus()
    AbsenceEntity
    getEndDate()
    getStatus()

    View Slide

  19. {% if absence.endDate < date() %}
    past
    {% else %}
    absence.status
    {% endif %}
    getDisplayStatus()
    AbsenceEntity
    getEndDate()
    getStatus()

    View Slide

  20. {{ absence.displayStatus }}
    getDisplayStatus()
    AbsenceEntity
    getEndDate()
    getStatus()
    getDisplayStatus()

    View Slide

  21. {{ absence.displayStatus }}
    getDisplayStatus()
    AbsenceEntity
    getEndDate()
    getStatus()
    getDisplayStatus()

    View Slide

  22. AbsenceEntity
    Request
    Absence
    Form
    Cancel
    Absence
    Form
    Approve
    Absence
    Form
    Change
    Absence
    Type
    Form
    Absence
    View
    upcoming
    .html
    .twig
    details
    .html
    .twig
    calendar
    .html
    .twig
    unapproved
    .html
    .twig

    View Slide

  23. AbsenceEntity
    Request
    Absence
    Form
    Cancel
    Absence
    Form
    Approve
    Absence
    Form
    Change
    Absence
    Type
    Form
    Absence
    View
    upcoming
    .html
    .twig
    details
    .html
    .twig
    calendar
    .html
    .twig
    unapproved
    .html
    .twig
    getStatus()

    View Slide

  24. Unapproved
    Absence
    View
    Calendar
    View
    AbsenceEntity
    Request
    Absence
    Form
    Cancel
    Absence
    Form
    Approve
    Absence
    Form
    Change
    Absence
    Type
    Form
    Upcoming
    Absences
    View
    Absence
    Details
    View
    upcoming
    .html
    .twig
    details
    .html
    .twig
    calendar
    .html
    .twig
    unapproved
    .html
    .twig

    View Slide

  25. SRP

    View Slide

  26. Behaviour Not State

    View Slide

  27. Request
    Absence
    Controller
    Absence
    Entity
    setReason($reason)
    setStatus(AbsenceEntity::CANCELLED)
    setCancellationDate(new DateTime())
    Cancel
    Absence
    Command
    getReason()

    View Slide

  28. Request
    Absence
    Controller
    Absence
    Entity
    cancel($reason)
    Cancel
    Absence
    Command
    getReason()

    View Slide

  29. Cancel
    Absence
    Command
    Absence
    Entity
    Validate internal consistency
    Validate user input

    View Slide

  30. CancelAbsenceComm
    andHandler
    Cancel
    Absence
    Command
    Handler
    AbsenceEntity
    cancel($reason)
    handle($command)
    Request
    Absence
    Controller
    Absence
    Entity
    cancel($reason)
    Cancel
    Absence
    Command

    View Slide

  31. Infrastructure?

    View Slide

  32. Absence
    Repository
    (Interface)
    findById($id)
    findUpcomingByMember($member)
    findAllByMember($member)
    Doctrine
    ORM
    Absence
    Repository
    Doctrine
    ODM
    Absence
    Repository
    Guzzle
    Client
    Absence
    Repository
    Infrastructure
    Domain

    View Slide

  33. AbsenceEntity
    Absence
    Repository
    Domain Bundle
    Service
    Config
    Infrastructure
    Doctrine
    ORM
    Absence
    Repository
    Mapping
    Config

    View Slide

  34. Absence
    Repository
    (Interface)
    findById($id)
    findUpcomingByMember($member)
    findAllByMember($member)
    add(AbsenceEntity $absence)

    View Slide

  35. Events

    View Slide

  36. OnUpdate
    Event
    AbsenceEntity Dispatches

    View Slide

  37. OnUpdate
    Event
    AbsenceEntity Dispatches

    View Slide

  38. Absence
    Cancelled
    Event
    Cancel
    Absence
    Command
    Handler
    Dispatches

    View Slide

  39. Absence
    Cancelled
    Event
    In Memory
    Listener
    Immediate Action Place In Messaging Queue
    Listens

    View Slide

  40. Absence
    Cancelled
    Event
    Flush
    Listener
    Listens
    Absence
    Approved
    Event
    Domain Infrastructure
    Listens

    View Slide

  41. Separating Commands From
    Queries

    View Slide

  42. Command
    Command
    Handler
    Entity Datastore

    View Slide

  43. Datastore
    View
    Datastore
    View
    Datastore
    Command
    Command
    Handler
    Entity
    Event

    View Slide

  44. Datastore
    View
    Datastore
    View
    Datastore
    Command
    Command
    Handler
    Entity
    View
    Template
    Event

    View Slide

  45. Separating Bundles Horizontally

    View Slide

  46. Non-application Specific Code

    View Slide

  47. HumanResources
    CustomLoggingBundle
    HumanResourcesBundle

    View Slide

  48. HumanResourcesBundle HumanResources
    CustomLoggingBundle CustomLogging
    CustomLoggingBundle
    CustomLoggingBundle CustomLogging
    HumanResourcesBundle

    View Slide

  49. HumanResources
    CustomLoggingBundle CustomLogging
    CustomLoggingBundle
    CustomLoggingBundle CustomLogging
    If it must!
    HumanResourcesBundle

    View Slide

  50. HumanResources
    CustomLoggingBundle CustomLogging
    CustomLoggingBundle
    CustomLoggingBundle CustomLogging
    HumanResourcesBundle

    View Slide

  51. Separating By Context

    View Slide

  52. AbsencePlannerBundle AbsencePlanner
    CustomLoggingBundle CustomLogging
    CustomLoggingBundle
    RecruitmentBundle Recruitment

    View Slide

  53. Message Queue/REST
    AbsencePlannerBundle AbsencePlanner
    CustomLoggingBundle CustomLogging
    CustomLoggingBundle
    RecruitmentBundle Recruitment

    View Slide

  54. CustomLoggingBundle CustomLogging
    CustomLoggingBundle
    RecruitmentBundle Recruitment
    Off the shelf Package
    Message Queue/REST
    Message Queue/REST
    AbsencePlannerBundle AbsencePlanner

    View Slide

  55. Separate Commonality

    View Slide

  56. AbsencePlannerBundle AbsencePlanner
    RecruitmentBundle Recruitment
    AbsencePlannerBundle AbsencePlanner
    CustomLoggingBundle CustomLogging
    CustomLoggingBundle
    RecruitmentBundle Recruitment
    User Management

    View Slide

  57. !=
    Staff
    Member
    Entity
    User
    Entity

    View Slide

  58. AbsencePlannerBundle AbsencePlanner
    AbsencePlannerBundle AbsencePlanner
    CustomLoggingBundle CustomLogging
    CustomLoggingBundle
    RecruitmentBundle Recruitment
    UserManagementBundle

    View Slide

  59. Now?

    View Slide

  60. http://www.flickr.com/photos/mtsofan/8313606885

    View Slide

  61. https://github.com/beberlei/litecqrs-php
    http://behat.org/

    View Slide

  62. http://williamdurand.fr/
    http://verraes.net/#blog
    http://www.whitewashing.de/

    View Slide

  63. QUESTIONS?

    View Slide