Skip to content

Instantly share code, notes, and snippets.

@cborgas
Last active October 17, 2021 07:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cborgas/06a7e011a46f27f6760c5b617962b91d to your computer and use it in GitHub Desktop.
Save cborgas/06a7e011a46f27f6760c5b617962b91d to your computer and use it in GitHub Desktop.
Extract Interface & Extend Class
<?php
interface FrontDeskInterface
{
public function addMemberships(array $emailAddresses): void;
}
class FrontDesk implements FrontDeskInterface
{
public function __construct(
protected CustomerRepository $customerRepository,
protected WelcomeMessageSender $welcomeMessageSender
) {}
public function addMemberships(array $emailAddresses): void
{
$customers = $this->getCustomers($emailAddresses);
$previousCustomers = [];
$newCustomers = [];
foreach ($customers as $customer) {
if ($this->hadMembership($customer)) {
$previousCustomers[] = $customer;
} else {
$newCustomers[] = $customer;
}
}
foreach ($newCustomers as $customer) {
$this->addMembership($customer);
$this->welcomeMessageSender->sendWelcomeMessage($customer);
}
foreach ($previousCustomers as $customer) {
$this->renewMembership($customer);
$this->welcomeMessageSender->sendWelcomeBackMessage($customer);
}
}
protected function addMembership(Customer $customer): void
{
// ...
}
protected function renewMembership(Customer $customer): void
{
// ...
}
protected function hadMembership(Customer $customer): bool
{
// ...
}
protected function getCustomers(array $emailAddresses): array
{
return $this->customerRepository->getCustomersByEmailAddresses(
$emailAddresses
);
}
}
class LoggingFrontDesk extends FrontDesk implements FrontDeskInterface
{
public function __construct(
CustomerRepository $customerRepository,
WelcomeMessageSender $welcomeMessageSender,
private LoggerInterface $logger
) {
parent::__construct($customerRepository, $welcomeMessageSender);
}
public function addMemberships(array $emailAddresses): void
{
$this->logger->debug(sprintf('Adding memberships for %s', implode(', ', $emailAddresses)));
parent::addMemberships($emailAddresses);
}
protected function addMembership(Customer $customer): void
{
$this->logger->debug(sprintf('Adding membership for %s', $customer->getName()));
try {
parent::addMembership($customer);
$this->logger->debug(sprintf('Membership added for %s', $customer->getName()));
} catch (RuntimeException $exception) {
$this->logger->error(
sprintf('Failed to add membership for %s', $customer->getName()),
[ 'exception' => $exception ]
);
}
}
protected function renewMembership(Customer $customer): void
{
$this->logger->debug(sprintf('Renewing membership for %s', $customer->getName()));
parent::renewMembership($customer);
}
protected function getCustomers(array $emailAddresses): array
{
$customers = parent::getCustomers($emailAddresses);
$this->logger->debug(sprintf('Found %s customers', count($customers)));
return $customers;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment