ContactMailer::send()   B
last analyzed

Complexity

Conditions 6
Paths 20

Size

Total Lines 40
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 8.048

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 6
eloc 26
c 2
b 0
f 0
nc 20
nop 2
dl 0
loc 40
ccs 16
cts 26
cp 0.6153
crap 8.048
rs 8.8817
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Contact;
6
7
use Exception;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Psr\Log\LoggerInterface;
10
use Yiisoft\Form\FormModelInterface;
11
use Yiisoft\Mailer\File;
12
use Yiisoft\Mailer\MailerInterface;
13
use Yiisoft\Mailer\MessageBodyTemplate;
14
use Yiisoft\Session\Flash\FlashInterface;
15
16
/**
17
 * ContactMailer sends an email from the contact form
18
 */
19
class ContactMailer
20
{
21
    private FlashInterface $flash;
22
    private LoggerInterface $logger;
23
    private MailerInterface $mailer;
24
    private string $to;
25
26 6
    public function __construct(
27
        FlashInterface $flash,
28
        LoggerInterface $logger,
29
        MailerInterface $mailer,
30
        string $to
31
    ) {
32 6
        $this->flash = $flash;
33 6
        $this->logger = $logger;
34 6
        $this->mailer = $mailer->withTemplate(new MessageBodyTemplate(__DIR__ . '/mail/'));
35 6
        $this->to = $to;
36 6
    }
37
38 2
    public function send(FormModelInterface $form, ServerRequestInterface $request)
39
    {
40 2
        $message = $this->mailer->compose(
41 2
            'contact-email',
42
            [
43 2
                'content' => $form->getAttributeValue('body'),
44
            ]
45
        )
46 2
            ->withSubject($form->getAttributeValue('subject'))
47 2
            ->withFrom([$form->getAttributeValue('email') => $form->getAttributeValue('name')])
48 2
            ->withTo($this->to);
49
50 2
        $attachFiles = $request->getUploadedFiles();
51 2
        foreach ($attachFiles as $attachFile) {
52
            foreach ($attachFile as $file) {
53
                if ($file->getError() === UPLOAD_ERR_OK) {
54
                    $message = $message->withAttached(
55
                        File::fromContent(
56
                            (string)$file->getStream(),
57
                            $file->getClientFilename(),
58
                            $file->getClientMediaType()
59
                        ),
60
                    );
61
                }
62
            }
63
        }
64
65
        try {
66 2
            $this->mailer->send($message);
67 2
            $flashMsg = 'Thank you for contacting us, we\'ll get in touch with you as soon as possible.';
68
        } catch (Exception $e) {
69
            $flashMsg = $e->getMessage();
70
            $this->logger->error($flashMsg);
71 2
        } finally {
72 2
            $this->flash->add(
73 2
                isset($e) ? 'danger' : 'success',
74
                [
75 2
                    'body' => $flashMsg,
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $flashMsg does not seem to be defined for all execution paths leading up to this point.
Loading history...
76
                ],
77 2
                true
78
            );
79
        }
80 2
    }
81
}
82