178 lines
4.5 KiB
PHP

<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\MainBundle\Notification;
use Chill\MainBundle\Entity\User;
use Psr\Log\LoggerInterface;
use Swift_Mailer;
use Swift_Message;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
use function call_user_func;
/**
* Class Mailer
* Classe d'aide pour l'envoi de notification.
*
* Héberge toutes les méthodes pour ré-écrire les URL en fonction de la langue de l'utilisateur.
*/
class Mailer
{
/**
* @var Swift_Mailer
*/
protected $forcedMailer;
/**
* @var LoggerInterface
*/
protected $logger;
/**
* @var Swift_Mailer
*/
protected $mailer;
/**
* @var array
*/
protected $routeParameters;
/**
* @var RouterInterface
*/
protected $router;
/**
* @var TranslatorInterface
*/
protected $translator;
/**
* @var \Twig\Environment
*/
protected $twig;
/**
* Mailer constructor.
*
* @param $routeParameters
*/
public function __construct(
LoggerInterface $logger,
Environment $twig,
Swift_Mailer $mailer,
// due to bug https://github.com/symfony/swiftmailer-bundle/issues/127
// \Swift_Transport $mailerTransporter,
RouterInterface $router,
TranslatorInterface $translator,
$routeParameters
) {
$this->logger = $logger;
$this->twig = $twig;
$this->mailer = $mailer;
//$this->forcedMailer = new \Swift_Mailer($mailerTransporter);
$this->router = $router;
$this->translator = $translator;
$this->routeParameters = $routeParameters;
}
/**
* @param $template
*
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*
* @return string
*/
public function renderContentToUser(User $to, $template, array $parameters = [])
{
$context = $this->router->getContext();
$previousHost = $context->getHost();
$previousScheme = $context->getScheme();
$context->setHost($this->routeParameters['host']);
$context->setScheme($this->routeParameters['scheme']);
$content = $this->twig->render($template, $parameters);
// reset the host
$context->setHost($previousHost);
$context->setScheme($previousScheme);
return $content;
}
/**
* @param $force
*
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
*/
public function sendMessage(Swift_Message $message, $force)
{
if ($force) {
$this->forcedMailer->send($message);
} else {
$this->mailer->send($message);
}
}
/**
* Envoie une notification à un utilisateur.
*
* @param array $subject Subject of the message [ 0 => $message (required), 1 => $parameters (optional), 3 => $domain (optional) ]
* @param array $bodies The bodies. An array where keys are the contentType and values the bodies
* @param callable $callback a callback to customize the message (add attachment, etc.)
* @param mixed $recipient
* @param mixed $force
*/
public function sendNotification(
$recipient,
array $subject,
array $bodies,
?callable $callback = null,
$force = false
) {
$fromEmail = $this->routeParameters['from_email'];
$fromName = $this->routeParameters['from_name'];
$to = $recipient instanceof User ? $recipient->getEmail() : $recipient;
$subjectI18n = $this->translator->trans(
$subject[0],
$subject[1] ?? [],
$subject[2] ?? null
);
$message = (new Swift_Message($subjectI18n))
->setFrom($fromEmail, $fromName)
->setTo($to);
foreach ($bodies as $contentType => $content) {
$message->setBody($content, $contentType);
}
if (null !== $callback) {
call_user_func($callback, $message);
}
$this->logger->info('[notification] Sending notification', [
'to' => $message->getTo(),
'subject' => $message->getSubject(),
]);
$this->sendMessage($message, $force);
}
}