Skip to content

Instantly share code, notes, and snippets.

@l3l0
Created August 11, 2018 09:57
Show Gist options
  • Select an option

  • Save l3l0/9e880b859043e591f61df4e735cbbf0f to your computer and use it in GitHub Desktop.

Select an option

Save l3l0/9e880b859043e591f61df4e735cbbf0f to your computer and use it in GitHub Desktop.
<?php
declare(strict_types=1);
class SellOnlineTicket implements Command
{
public function clientDetails(): ClientDetails
{}
public function clientEmail(): Email
{}
public function eventId(): EventId
{}
}
<?php
declare(strict_types=1);
class SellOnlineTicketHandler implements CommandHandler
{
private $transactionManager;
private $ticketGenerator;
private $ticketSender;
private $tickets;
public function __construct(
TransactionManager $manager,
TicketGenerator $generator,
Tickets $tickets,
TicketSender $sender
) {
$this->transactionManager = $manager;
$this->ticketGenerator = $generator;
$this->ticketSender = $sender;
$this->tickets = $tickets;
}
public function execute(SellOnlineTicket $command): void
{
$this->transactionManager->begin();
try {
$ticket = $this->ticketGenerator->generate(
$command->clientDetails(),
$command->eventId()
);
$this->tickets->add($ticket);
$this->transactionManager->commit();
} catch (Throwable $e) {
$this->transactionManager->rollback();
throw $e;
}
$this->ticketSender->send($ticket, $command->clientEmail());
}
}
<?php
declare(strict_types=1);
interface TicketGenerator
{
public function generate(ClientDetails $details, EventId $id): Ticket;
}
<?php
declare(strict_types=1);
interface Tickets
{
/**
* @throws TicketNotFound
*/
public function get(TicketNumber $number): Ticket;
public function add(Ticket): void;
}
<?php
declare(strict_types=1);
interface TicketSender
{
/**
* @throws EmailSenderFailure
*/
public function send(Ticket $ticket, Email $email): void;
}
<?php
declare(strict_types=1);
interface TransactionManager
{
public function begin(): void;
public function commit(): void;
public function rollback(): void;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment