FormSubmissionSymfonyMailer   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 54
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 27
dl 0
loc 54
rs 10
c 1
b 0
f 1
wmc 9

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 13 3
A process() 0 16 3
A replaceValues() 0 13 3
1
<?php
2
3
namespace WebTheory\Saveyour\Processor;
4
5
use Closure;
6
use LogicException;
7
use Psr\Http\Message\ServerRequestInterface;
8
use Symfony\Component\Mailer\Mailer;
9
use Symfony\Component\Mime\Email;
10
use Symfony\Component\Mime\Part\TextPart;
11
use WebTheory\Saveyour\Contracts\Processor\FormDataProcessorInterface;
12
use WebTheory\Saveyour\Contracts\Report\FormProcessReportInterface;
13
use WebTheory\Saveyour\Processor\Abstracts\AbstractFormDataProcessor;
14
15
class FormSubmissionSymfonyMailer extends AbstractFormDataProcessor implements FormDataProcessorInterface
16
{
17
    protected Mailer $mailer;
18
19
    protected Email $email;
20
21
    protected Closure $composer;
22
23
    public function __construct(string $name, Mailer $mailer, ?Email $email = null, ?Closure $composer = null, ?array $fields = null)
24
    {
25
        if (!$email && !$composer) {
26
            throw new LogicException(
27
                'At least one of arguments "$email" or "$composer" must be provided.'
28
            );
29
        }
30
31
        parent::__construct($name, $fields);
32
33
        $this->mailer = $mailer;
34
        $this->email = $email ?? new Email();
35
        $this->composer = $composer;
36
    }
37
38
    public function process(ServerRequestInterface $request, array $results): ?FormProcessReportInterface
39
    {
40
        if (!$this->allFieldsPresent($results)) {
41
            return null;
42
        }
43
44
        $values = $this->mappedValues($results);
45
        $message = (isset($this->composer))
46
            ? ($this->composer)($values, $this->email, $request)
47
            : $this->replaceValues($values);
48
49
        $this->email->setBody(new TextPart($message));
50
51
        $this->mailer->send($this->email, $this->envelope);
0 ignored issues
show
Bug Best Practice introduced by
The property envelope does not exist on WebTheory\Saveyour\Proce...SubmissionSymfonyMailer. Did you maybe forget to declare it?
Loading history...
52
53
        return null;
54
    }
55
56
    protected function replaceValues(array $values): string
57
    {
58
        $message = $this->email->getBody()->bodyToString();
59
60
        foreach ($values as $key => $value) {
61
            if ($message) {
62
                $message = str_replace('{{' . $key . '}}', $value, $message);
63
            } else {
64
                $message .= sprintf("%s: %s\n", $key, $value);
65
            }
66
        }
67
68
        return $message;
69
    }
70
}
71