From 8f6045d46506bed2b9f1bc910af5b1a0359e1f72 Mon Sep 17 00:00:00 2001
From: erikn69 <erikn_69@hotmail.com>
Date: Fri, 8 Sep 2023 17:00:50 -0500
Subject: [PATCH] Add SymfonyMailCollector (#554)

* Add SymfonyMailCollector

* add examples for SymfonyMailCollector
---
 CHANGELOG.md                                  |  4 +
 README.md                                     |  1 +
 demo/bridge/symfonymailer/composer.json       |  6 ++
 demo/bridge/symfonymailer/index.php           | 48 +++++++++++
 demo/index.php                                |  1 +
 docs/bridge_collectors.md                     | 14 ++++
 .../Bridge/Symfony/SymfonyMailCollector.php   | 84 +++++++++++++++++++
 7 files changed, 158 insertions(+)
 create mode 100644 demo/bridge/symfonymailer/composer.json
 create mode 100644 demo/bridge/symfonymailer/index.php
 create mode 100644 src/DebugBar/Bridge/Symfony/SymfonyMailCollector.php

diff --git a/CHANGELOG.md b/CHANGELOG.md
index cf87671..6d51349 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,8 @@
 # Changelog
+2023-09-08
+
+ - Add SymfonyMailCollector (#554)
+
 2021-12-21
 
  - Add support for `symfony/var-dumper^6` package
diff --git a/README.md b/README.md
index f9c0112..3429b37 100644
--- a/README.md
+++ b/README.md
@@ -27,6 +27,7 @@ Includes collectors for:
   - [Monolog](https://github.com/Seldaek/monolog)
   - [Propel](http://propelorm.org/)
   - [Slim](http://slimframework.com)
+  - [Symfony Mailer](https://symfony.com/doc/current/mailer.html)
   - [Swift Mailer](http://swiftmailer.org/)
   - [Twig](http://twig.symfony.com/)
 
diff --git a/demo/bridge/symfonymailer/composer.json b/demo/bridge/symfonymailer/composer.json
new file mode 100644
index 0000000..75ca9a2
--- /dev/null
+++ b/demo/bridge/symfonymailer/composer.json
@@ -0,0 +1,6 @@
+{
+    "require": {
+        "symfony/event-dispatcher": "*",
+        "symfony/mailer": "*"
+    }
+}
diff --git a/demo/bridge/symfonymailer/index.php b/demo/bridge/symfonymailer/index.php
new file mode 100644
index 0000000..f266efa
--- /dev/null
+++ b/demo/bridge/symfonymailer/index.php
@@ -0,0 +1,48 @@
+<?php
+
+use DebugBar\Bridge\Symfony\SymfonyMailCollector;
+use DebugBar\DataCollector\MessagesCollector;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+use Symfony\Component\Mailer\Event\SentMessageEvent;
+use Symfony\Component\Mailer\Mailer;
+use Symfony\Component\Mailer\Transport\AbstractTransport;
+use Symfony\Component\Mime\Email;
+
+include __DIR__ . '/vendor/autoload.php';
+include __DIR__ . '/../../bootstrap.php';
+
+$debugbarRenderer->setBaseUrl('../../../src/DebugBar/Resources');
+
+$mailCollector = new SymfonyMailCollector();
+$debugbar->addCollector($mailCollector);
+$logger = new MessagesCollector('mails');
+$debugbar['messages']->aggregate($logger);
+
+// Add even listener for SentMessageEvent
+$dispatcher = new EventDispatcher();
+$dispatcher->addListener(SentMessageEvent::class, function (SentMessageEvent $event) use ($mailCollector): void {
+    $mailCollector->addSymfonyMessage($event->getMessage());
+});
+
+// Creates NullTransport Mailer for testing
+$mailer = new Mailer(new class ($dispatcher, $logger) extends AbstractTransport {
+    protected function doSend(\Symfony\Component\Mailer\SentMessage $message): void
+    {
+        $this->getLogger()->debug('Sending message "'.$message->getOriginalMessage()->getSubject().'"');
+    }
+    public function __toString(): string{ return 'null://'; }
+});
+
+$email = (new Email())
+    ->from('john@doe.com')
+    ->to('you@example.com')
+    //->cc('cc@example.com')
+    //->bcc('bcc@example.com')
+    //->replyTo('fabien@example.com')
+    //->priority(Email::PRIORITY_HIGH)
+    ->subject('Wonderful Subject')
+    ->text('Here is the message itself');
+
+$mailer->send($email);
+
+render_demo_page();
diff --git a/demo/index.php b/demo/index.php
index 25015d3..51dae09 100644
--- a/demo/index.php
+++ b/demo/index.php
@@ -42,6 +42,7 @@ render_demo_page(function() {
     <li><a href="bridge/propel">Propel</a></li>
     <li><a href="bridge/slim">Slim</a></li>
     <li><a href="bridge/swiftmailer">Swift mailer</a></li>
+    <li><a href="bridge/symfonymailer">Symfony mailer</a></li>
     <li><a href="bridge/twig">Twig</a></li>
 </ul>
 <?php
diff --git a/docs/bridge_collectors.md b/docs/bridge_collectors.md
index f0ab486..e923b07 100644
--- a/docs/bridge_collectors.md
+++ b/docs/bridge_collectors.md
@@ -86,6 +86,20 @@ Display log messages and sent mail using `DebugBar\Bridge\SwiftMailer\SwiftLogCo
     $debugbar['messages']->aggregate(new DebugBar\Bridge\SwiftMailer\SwiftLogCollector($mailer));
     $debugbar->addCollector(new DebugBar\Bridge\SwiftMailer\SwiftMailCollector($mailer));
 
+## Symfony Mailer
+
+https://symfony.com/doc/current/mailer.html
+
+Display log messages and sent mail using `DebugBar\Bridge\Symfony\SymfonyMailCollector`
+
+    use Symfony\Component\Mailer\Event\SentMessageEvent;
+
+    $mailCollector = new DebugBar\Bridge\Symfony\SymfonyMailCollector();
+    $debugbar->addCollector($mailCollector);
+    $eventDispatcher->addListener(SentMessageEvent::class, function (SentMessageEvent $event) use (&$mailCollector): void {
+        $mailCollector->addSymfonyMessage($event->getMessage());
+    });
+
 ## Twig
 
 http://twig.sensiolabs.org/
diff --git a/src/DebugBar/Bridge/Symfony/SymfonyMailCollector.php b/src/DebugBar/Bridge/Symfony/SymfonyMailCollector.php
new file mode 100644
index 0000000..7095e8d
--- /dev/null
+++ b/src/DebugBar/Bridge/Symfony/SymfonyMailCollector.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace DebugBar\Bridge\Symfony;
+
+use DebugBar\DataCollector\AssetProvider;
+use DebugBar\DataCollector\DataCollector;
+use DebugBar\DataCollector\Renderable;
+
+/**
+ * Collects data about sent mail events
+ *
+ * https://github.com/symfony/mailer
+ */
+class SymfonyMailCollector extends DataCollector implements Renderable, AssetProvider
+{
+    /** @var array */
+    private $messages = array();
+
+    /** @var bool */
+    private $showDetailed = false;
+
+    /** @param \Symfony\Component\Mailer\SentMessage $message */
+    public function addSymfonyMessage($message)
+    {
+        $this->messages[] = $message->getOriginalMessage();
+    }
+
+    public function showMessageDetail()
+    {
+        $this->showDetailed = true;
+    }
+
+    public function collect()
+    {
+        $mails = array();
+
+        foreach ($this->messages as $message) {
+            /* @var \Symfony\Component\Mime\Message $message */
+            $mails[] = array(
+                'to' => array_map(function ($address) {
+                    /* @var \Symfony\Component\Mime\Address $address */
+                    return $address->toString();
+                }, $message->getTo()),
+                'subject' => $message->getSubject(),
+                'headers' => ($this->showDetailed ? $message : $message->getHeaders())->toString(),
+            );;
+        }
+
+        return array(
+            'count' => count($mails),
+            'mails' => $mails,
+        );
+    }
+
+    public function getName()
+    {
+        return 'symfonymailer_mails';
+    }
+
+    public function getWidgets()
+    {
+        return array(
+            'emails' => array(
+                'icon' => 'inbox',
+                'widget' => 'PhpDebugBar.Widgets.MailsWidget',
+                'map' => 'symfonymailer_mails.mails',
+                'default' => '[]',
+                'title' => 'Mails'
+            ),
+            'emails:badge' => array(
+                'map' => 'symfonymailer_mails.count',
+                'default' => 'null'
+            )
+        );
+    }
+
+    public function getAssets()
+    {
+        return array(
+            'css' => 'widgets/mails/widget.css',
+            'js' => 'widgets/mails/widget.js'
+        );
+    }
+}