DefaultMailSender::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace SixtyEightPublishers\User\Common\Mail;
6
7
use Nette\SmartObject;
8
use Contributte\Mailing\IMailBuilderFactory;
9
use SixtyEightPublishers\User\Common\Exception\MailSendingException;
10
11
final class DefaultMailSender implements MailSenderInterface
12
{
13
	use SmartObject;
14
15
	/** @var string  */
16
	private $templatesDir;
17
18
	/** @var \SixtyEightPublishers\User\Common\Mail\Address  */
19
	private $from;
20
21
	/** @var array  */
22
	private $subjects;
23
24
	/** @var \Contributte\Mailing\IMailBuilderFactory  */
25
	private $mailBuilderFactory;
26
27
	/**
28
	 * @param string                                         $templatesDir
29
	 * @param \SixtyEightPublishers\User\Common\Mail\Address $from
30
	 * @param array                                          $subjects
31
	 * @param \Contributte\Mailing\IMailBuilderFactory       $mailBuilderFactory
32
	 */
33
	public function __construct(string $templatesDir, Address $from, array $subjects, IMailBuilderFactory $mailBuilderFactory)
34
	{
35
		$this->templatesDir = rtrim($templatesDir, '\\/');
36
		$this->from = $from;
37
		$this->subjects = $subjects;
38
		$this->mailBuilderFactory = $mailBuilderFactory;
39
	}
40
41
	/**
42
	 * {@inheritdoc}
43
	 */
44
	public function send(string $mailName, array $to, array $args): void
45
	{
46
		$file = $this->templatesDir . '/' . $mailName . '.latte';
47
48
		if (!file_exists($file)) {
49
			throw new MailSendingException(sprintf(
50
				'Missing template for mail "%s"',
51
				$mailName
52
			));
53
		}
54
55
		$builder = $this->mailBuilderFactory->create();
56
57
		$builder->getTemplate()->setFile($file);
58
		$builder->setParameters($args);
59
		$builder->setSubject($this->subjects[$mailName] ?? '');
60
		$builder->setFrom($this->from->getEmail(), $this->from->getName());
61
62
		/** @var \SixtyEightPublishers\User\Common\Mail\Address $address */
63
		foreach ($to as $address) {
64
			$builder->addTo($address->getEmail(), $address->getName());
65
		}
66
67
		$builder->send();
68
	}
69
}
70