Command Pattern

People’s Postcode Lottery - PHP Workshop - March 2017

What Is It?

 

Behavioural Design Pattern

Encapsulate the behaviour of an action

What Is A Command Anyway?

Encapsulation of a Request
as an Object

 

Abstraction to an underlying
Domain Concept

class AddToBasketCommand
{
    private $basketId;

    private $item;

    public function __construct($basketId, $item)
    {
        $this->basketId = $basketId;
        $this->item = $item;
    }

    public function getBasketId()
    {
        return $this->basketId;
    }

    public function getItem()
    {
        return $this->item;
    }
}

Simple!

Commands are just data structures, no behaviour themselves

Wait, didn’t you say they’re an abstraction of behaviour?

Yes! Behaviour is managed by the Handler!

Command Handlers

1 Command = 1 Handler

Handlers Manage Domain Logic

No More Object Saves In Controllers!

Don't do secondary actions in Handlers

class AddToBasketCommandHandler
{
    private $repository;

    public function __construct($basketRepository)
    {
        $this->repository = $basketRepository;
    }

    public function execute(AddToBasketCommand $command)
    {
        $basket = $this->repository->find(
            $command->getBasketId()
        );
        $basket->addItem($command->getItem());
        $basket->save();
    }
}

Testing

Unit tests for handlers

Unit test handler collaborators

Integration test against Message Bus (sometimes...)

Command Results

Events

  • 1 Handled Command => 0 Events
  • Events can be processed async
  • Opens Architectural doors

State Changes

  • New Records In The Database
    • RegisterUser
  • Changed Records In The Database
    • ChangePassword

What's Next?

CQRS

Separation of Read/Write data

Queries defined as objects as well

Further separation of concerns

Event Sourcing

All actions produce Domain Events

State is replayable at any time

Explicit audit log

No data loss

Resources

https://php-and-symfony.matthiasnoback.nl/2015/01/from-commands-to-events/

http://verraes.net/2015/02/form-command-model-validation/

http://www.blackwasp.co.uk/Command.aspx

Command Pattern

By Scott Pringle

Command Pattern

Internal slides for a Command Pattern discussion/workshop

  • 639