Back to Sylius

API - Sending emails

adr/2020_11_18_sending_emails_via_api.md

2.2.51.9 KB
Original Source

API - Sending emails

  • Status: accepted
  • Date: 2020-11-18

Context and Problem Statement

To achieve 100% API coverage, we need to handle emails by API.

Considered Options

Using events

Using events allow us to trigger any handler once operation is completed.

  • Sylius\ApiBundle\Event\OrderCompleted

Once this event is triggered we handle it with src/Sylius/Bundle/ApiBundle/EventHandler/OrderCompletedHandler.php

Then command src/Sylius/Bundle/ApiBundle/Command/SendOrderConfirmation.php is dispatched, which triggers command handler (src/Sylius/Bundle/ApiBundle/CommandHandler/SendOrderConfirmationHandler.php)

SendOrderConfirmationHandler is sending email based on its destination (in this case OrderConfirmation)

$this->emailSender->send(
    Emails::ORDER_CONFIRMATION_RESENT,
    [$order->getCustomer()->getEmail()],
    [
        'order' => $order,
        'channel' => $order->getChannel(),
        'localeCode' => $order->getLocaleCode(),
    ]
);
  • Good, because it's easy to integrate other logic after the initial command will succeed.

  • Good, because it's easy to trigger the same operation several times.

  • Good, because it's easier to handle mailing server downs gracefully.

  • Bad, because adds a lot of abstraction, can be hard to understand.

Direct email call

in src/Sylius/Bundle/ApiBundle/CommandHandler/Checkout/CompleteOrderHandler.php we create direct call to email

php
$this->emailManager->sendConfirmationEmail($cart);
  • Good, because its easy to understand.

  • Bad, because it can generate a lot of problems in future as it should be sent asynchronously, email manager class should be changed to handle it somehow, hard to implement.

Decision Outcome

Chosen option: "Using events", because it allows us to send email using events, commands and handlers. Thanks to this we can queue few messages in async transport.