* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace App\EventSubscriber; use App\Entity\Comment; use App\Event\CommentCreatedEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Email; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Contracts\Translation\TranslatorInterface; /** * Notifies post's author about new comments. * * @author Oleg Voronkovich */ class CommentNotificationSubscriber implements EventSubscriberInterface { private $mailer; private $translator; private $urlGenerator; private $sender; public function __construct(MailerInterface $mailer, UrlGeneratorInterface $urlGenerator, TranslatorInterface $translator, string $sender) { $this->mailer = $mailer; $this->urlGenerator = $urlGenerator; $this->translator = $translator; $this->sender = $sender; } public static function getSubscribedEvents(): array { return [ CommentCreatedEvent::class => 'onCommentCreated', ]; } public function onCommentCreated(CommentCreatedEvent $event): void { /** @var Comment $comment */ $comment = $event->getComment(); $post = $comment->getPost(); $linkToPost = $this->urlGenerator->generate('blog_post', [ 'slug' => $post->getSlug(), '_fragment' => 'comment_'.$comment->getId(), ], UrlGeneratorInterface::ABSOLUTE_URL); $subject = $this->translator->trans('notification.comment_created'); $body = $this->translator->trans('notification.comment_created.description', [ '%title%' => $post->getTitle(), '%link%' => $linkToPost, ]); // See https://symfony.com/doc/current/mailer.html $email = (new Email()) ->from($this->sender) ->to($post->getAuthor()->getEmail()) ->subject($subject) ->html($body) ; // In config/packages/dev/mailer.yaml the delivery of messages is disabled. // That's why in the development environment you won't actually receive any email. // However, you can inspect the contents of those unsent emails using the debug toolbar. $this->mailer->send($email); } }