Skip to content

Commit

Permalink
Refactor CID system
Browse files Browse the repository at this point in the history
  • Loading branch information
PedroTroller committed Nov 19, 2015
1 parent 315b7f5 commit eb93bdb
Show file tree
Hide file tree
Showing 13 changed files with 190 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public function supports($content)
return false;
}

return false === strpos($headers[0],'404');
return false === strpos($headers[0], '404');
}

/**
Expand Down
59 changes: 59 additions & 0 deletions src/Knp/UniMail/Cid/Collection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

namespace Knp\UniMail\Cid;

use Swift_Mime_Attachment;

class Collection implements \IteratorAggregate
{
/**
* @var Swift_Mime_Attachment[]
*/
private $cids;

/**
* @param Swift_Mime_Attachment[] $cids
*/
public function __construct($cids = [])
{
$this->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;
}
}
13 changes: 13 additions & 0 deletions src/Knp/UniMail/Cid/Resolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Knp\UniMail\Cid;

interface Resolver
{
/**
* @param string $string
*
* @return Swift_EmbeddedFile|null
*/
public function createFromString($string);
}
36 changes: 36 additions & 0 deletions src/Knp/UniMail/Cid/Resolver/LocalFile.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace Knp\UniMail\Cid\Resolver;

use Knp\UniMail\Cid\Resolver;
use Swift_EmbeddedFile;

class LocalFile implements Resolver
{
/**
* @var string
*/
private $directory;

/**
* @param string $directory
*/
public function __construct($directory)
{
$this->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));
}
}
27 changes: 27 additions & 0 deletions src/Knp/UniMail/Cid/Resolver/RemoteFile.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Knp\UniMail\Cid\Resolver;

use Knp\UniMail\Cid\Resolver;
use Swift_EmbeddedFile;

class RemoteFile implements Resolver
{
/**
* {@inheritdoc}
*/
public function createFromString($string)
{
$headers = @get_headers($string);

if (false === $headers) {
return;
}

if (false !== strpos($headers[0], '404')) {
return;
}

return Swift_EmbeddedFile::fromPath($string);
}
}
2 changes: 1 addition & 1 deletion src/Knp/UniMail/EventListener/AttachmentResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public function __construct(AttachmentFactory $factory)
public static function getSubscribedEvents()
{
return [
MailerEvents::PRE_SEND => array('beforeSend', -2)
MailerEvents::PRE_SEND => array('beforeSend', -2),
];
}

Expand Down
8 changes: 4 additions & 4 deletions src/Knp/UniMail/EventListener/CidAttachmentMerger.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -11,15 +11,15 @@ class CidAttachmentMerger implements EventSubscriberInterface
{
private $cids;

public function __construct(ArrayCollection $cids)
public function __construct(Collection $cids)
{
$this->cids = $cids;
}

public static function getSubscribedEvents()
{
return [
MailerEvents::PRE_SEND => array('beforeSend', -3)
MailerEvents::PRE_SEND => array('beforeSend', -3),
];
}

Expand All @@ -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
);

Expand Down
2 changes: 1 addition & 1 deletion src/Knp/UniMail/EventListener/TwigRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -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),
];
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/Knp/UniMail/Mailer/SwiftMailer.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion src/Knp/UniMail/Mailer/TwigMailer.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
33 changes: 21 additions & 12 deletions src/Knp/UniMail/Resources/config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }

Expand All @@ -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
Expand Down Expand Up @@ -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%
38 changes: 24 additions & 14 deletions src/Knp/UniMail/Twig/CidExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
}

/**
Expand All @@ -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';
Expand Down

0 comments on commit eb93bdb

Please sign in to comment.