diff --git a/src/Knp/UniMail/AttachmentFactory/RemoteAttachmentFactory.php b/src/Knp/UniMail/AttachmentFactory/RemoteAttachmentFactory.php index ebbd933..f9b95c1 100644 --- a/src/Knp/UniMail/AttachmentFactory/RemoteAttachmentFactory.php +++ b/src/Knp/UniMail/AttachmentFactory/RemoteAttachmentFactory.php @@ -22,7 +22,7 @@ public function supports($content) return false; } - return false === strpos($headers[0],'404'); + return false === strpos($headers[0], '404'); } /** diff --git a/src/Knp/UniMail/Cid/Collection.php b/src/Knp/UniMail/Cid/Collection.php new file mode 100644 index 0000000..ba7f013 --- /dev/null +++ b/src/Knp/UniMail/Cid/Collection.php @@ -0,0 +1,59 @@ +cids = $cids; + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + return new \ArrayIterator($this->cids); + } + + /** + * @return Swift_Mime_Attachment[] + */ + public function all() + { + return $this->cids; + } + + /** + * @param Swift_Mime_Attachment $cid + * + * @return Collection + */ + public function add(Swift_Mime_Attachment $cid) + { + $this->cids[$cid->getId()] = $cid; + + return $this; + } + + /** + * @return Collection + */ + public function clear() + { + $this->cids = []; + + return $this; + } +} diff --git a/src/Knp/UniMail/Cid/Resolver.php b/src/Knp/UniMail/Cid/Resolver.php new file mode 100644 index 0000000..ce3a604 --- /dev/null +++ b/src/Knp/UniMail/Cid/Resolver.php @@ -0,0 +1,13 @@ +directory = $directory; + } + + /** + * {@inheritdoc} + */ + public function createFromString($string) + { + $string = str_replace('/', DIRECTORY_SEPARATOR, $string); + + if (false === file_exists($string)) { + return; + } + + return Swift_EmbeddedFile::fromPath(sprintf('%s%s%s', $this->directory, DIRECTORY_SEPARATOR, $string)); + } +} diff --git a/src/Knp/UniMail/Cid/Resolver/RemoteFile.php b/src/Knp/UniMail/Cid/Resolver/RemoteFile.php new file mode 100644 index 0000000..d1325d3 --- /dev/null +++ b/src/Knp/UniMail/Cid/Resolver/RemoteFile.php @@ -0,0 +1,27 @@ + array('beforeSend', -2) + MailerEvents::PRE_SEND => array('beforeSend', -2), ]; } diff --git a/src/Knp/UniMail/EventListener/CidAttachmentMerger.php b/src/Knp/UniMail/EventListener/CidAttachmentMerger.php index bbb2db9..2c0af1a 100644 --- a/src/Knp/UniMail/EventListener/CidAttachmentMerger.php +++ b/src/Knp/UniMail/EventListener/CidAttachmentMerger.php @@ -2,7 +2,7 @@ namespace Knp\UniMail\EventListener; -use Doctrine\Common\Collections\ArrayCollection; +use Knp\UniMail\Cid\Collection; use Knp\UniMail\MailerEvent; use Knp\UniMail\MailerEvents; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -11,7 +11,7 @@ class CidAttachmentMerger implements EventSubscriberInterface { private $cids; - public function __construct(ArrayCollection $cids) + public function __construct(Collection $cids) { $this->cids = $cids; } @@ -19,7 +19,7 @@ public function __construct(ArrayCollection $cids) public static function getSubscribedEvents() { return [ - MailerEvents::PRE_SEND => array('beforeSend', -3) + MailerEvents::PRE_SEND => array('beforeSend', -3), ]; } @@ -28,7 +28,7 @@ public function beforeSend(MailerEvent $event) $mail = $event->getMail(); $attachments = $mail->getAttachments(); $attachments = array_merge( - $this->cids->toArray(), + $this->cids->all(), $attachments ); diff --git a/src/Knp/UniMail/EventListener/TwigRenderer.php b/src/Knp/UniMail/EventListener/TwigRenderer.php index f76dcbb..a2ed790 100644 --- a/src/Knp/UniMail/EventListener/TwigRenderer.php +++ b/src/Knp/UniMail/EventListener/TwigRenderer.php @@ -21,7 +21,7 @@ public function __construct(Twig_Environment $twig) public static function getSubscribedEvents() { return [ - MailerEvents::PRE_SEND => array('beforeSend', -2) + MailerEvents::PRE_SEND => array('beforeSend', -2), ]; } diff --git a/src/Knp/UniMail/MailFactory/StrategyMailer/TwigMailFactory.php b/src/Knp/UniMail/MailFactory/StrategyMailer/TwigMailFactory.php index 17dcfe0..daaa6c6 100644 --- a/src/Knp/UniMail/MailFactory/StrategyMailer/TwigMailFactory.php +++ b/src/Knp/UniMail/MailFactory/StrategyMailer/TwigMailFactory.php @@ -2,9 +2,9 @@ namespace Knp\UniMail\MailFactory\StrategyMailer; +use Knp\UniMail\Mail\TwigMail; use Knp\UniMail\MailFactory; use Knp\UniMail\MailFactory\StrategyMailer; -use Knp\UniMail\Mail\TwigMail; use Symfony\Component\PropertyAccess\PropertyAccess; class TwigMailFactory implements StrategyMailer, MailFactory diff --git a/src/Knp/UniMail/Mailer/SwiftMailer.php b/src/Knp/UniMail/Mailer/SwiftMailer.php index a8c19d3..f863984 100644 --- a/src/Knp/UniMail/Mailer/SwiftMailer.php +++ b/src/Knp/UniMail/Mailer/SwiftMailer.php @@ -3,9 +3,9 @@ namespace Knp\UniMail\Mailer; use Knp\UniMail\Mail; -use Knp\UniMail\MailFactory; use Knp\UniMail\Mail\SwiftMail; use Knp\UniMail\Mailer; +use Knp\UniMail\MailFactory; use Swift_Mailer; use Swift_Message; diff --git a/src/Knp/UniMail/Mailer/TwigMailer.php b/src/Knp/UniMail/Mailer/TwigMailer.php index 9999236..1e5f0a6 100644 --- a/src/Knp/UniMail/Mailer/TwigMailer.php +++ b/src/Knp/UniMail/Mailer/TwigMailer.php @@ -4,8 +4,8 @@ use Doctrine\Common\Collections\ArrayCollection; use Knp\UniMail\Mail; -use Knp\UniMail\MailFactory; use Knp\UniMail\Mailer as MailerInterface; +use Knp\UniMail\MailFactory; use Swift_Mailer; use Swift_Message; use Twig_Environment; diff --git a/src/Knp/UniMail/Resources/config/services.yml b/src/Knp/UniMail/Resources/config/services.yml index c7556b0..5e4e872 100644 --- a/src/Knp/UniMail/Resources/config/services.yml +++ b/src/Knp/UniMail/Resources/config/services.yml @@ -18,13 +18,20 @@ services: knp_unimail.attachment_factory: alias: knp_unimail.attachment_factory.chain_attachment_factory - knp_unimail.collection.cids: - class: Doctrine\Common\Collections\ArrayCollection + knp_unimail.cid.collection: + class: Knp\UniMail\Cid\Collection + + knp_unimail.event_listener.attachment_resolver: + class: Knp\UniMail\EventListener\AttachmentResolver + arguments: + - @knp_unimail.attachment_factory + tags: + - { name: kernel.event_subscriber } knp_unimail.event_listener.cid_attachment_merger: class: Knp\UniMail\EventListener\CidAttachmentMerger arguments: - - @knp_unimail.collection.cids + - @knp_unimail.cid.collection tags: - { name: kernel.event_subscriber } @@ -35,13 +42,6 @@ services: tags: - { name: kernel.event_subscriber } - knp_unimail.event_listener.attachment_resolver: - class: Knp\UniMail\EventListener\AttachmentResolver - arguments: - - @knp_unimail.attachment_factory - tags: - - { name: kernel.event_subscriber } - knp_unimail.mail_factory.configuration_aware_factory: class: Knp\UniMail\MailFactory\ConfigurationAwareFactory public: false @@ -83,8 +83,17 @@ services: knp_unimail.twig.cid_extension: class: Knp\UniMail\Twig\CidExtension arguments: - - @knp_unimail.collection.cids - - %knp_unimail.attachments_directory% + - @knp_unimail.cid.collection + - [@knp_unimail.cid.resolver.local_file, @knp_unimail.cid.resolver.remove_file] tags: - { name: twig.extension } + knp_unimail.cid.resolver.local_file: + class: Knp\UniMail\Cid\Resolver\LocalFile + arguments: + - %knp_unimail.attachments_directory% + + knp_unimail.cid.resolver.remove_file: + class: Knp\UniMail\Cid\Resolver\RemoteFile + arguments: + - %knp_unimail.attachments_directory% diff --git a/src/Knp/UniMail/Twig/CidExtension.php b/src/Knp/UniMail/Twig/CidExtension.php index dc3369c..0afe091 100644 --- a/src/Knp/UniMail/Twig/CidExtension.php +++ b/src/Knp/UniMail/Twig/CidExtension.php @@ -3,7 +3,8 @@ namespace Knp\UniMail\Twig; use Doctrine\Common\Collections\ArrayCollection; -use Swift_EmbeddedFile; +use Knp\UniMail\Cid\Collection; +use Knp\UniMail\Cid\Resolver; use Twig_Extension; use Twig_SimpleFunction; @@ -15,18 +16,18 @@ class CidExtension extends Twig_Extension private $cids; /** - * @var string + * @var Resolver[] */ - private $directory; + private $resolvers; /** - * @param ArrayCollection $cids - * @param string $directory + * @param Collection $cids + * @param Resolver[] $resolvers */ - public function __construct(ArrayCollection $cids, $directory) + public function __construct(Collection $cids, array $resolvers) { $this->cids = $cids; - $this->directory = $directory; + $this->resolvers = $resolvers; } /** @@ -39,19 +40,28 @@ public function getFunctions() ]; } + /** + * @param string $path + * + * @return string + */ public function addCid($path) { - $path = str_replace('/', DIRECTORY_SEPARATOR, $path); - - $attachment = Swift_EmbeddedFile::fromPath(sprintf('%s%s%s', $this->directory, DIRECTORY_SEPARATOR, $path)); - $attachment->setDisposition('inline'); + foreach ($this->resolvers as $resolver) { + if (null !== $attachment = $resolver->createFromString($path)) { + $attachment->setDisposition('inline'); + $this->cids->add($attachment); - $parts = explode(DIRECTORY_SEPARATOR, $path); - $this->cids[end($parts)] = $attachment; + return sprintf('cid:%s', $attachment->getId()); + } + } - return sprintf('cid:%s', $attachment->getId()); + throw new \RuntimeException(sprintf('Can\'t resolve cid from "%s".', $path)); } + /** + * {@inheritdoc} + */ public function getName() { return 'knp_unimail.cids';