Completed
Push — master ( aa8b87...f1e278 )
by
unknown
01:40
created

TemplateMailable::getTemplateModel()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Spatie\MailTemplates;
4
5
use Illuminate\Bus\Queueable;
6
use Illuminate\Mail\Mailable;
7
use Illuminate\Support\HtmlString;
8
use ReflectionClass;
9
use ReflectionProperty;
10
use Spatie\MailTemplates\Models\MailTemplate;
11
12
abstract class TemplateMailable extends Mailable
13
{
14
    protected static $templateModel = MailTemplate::class;
15
16
    public static function getVariables(): array
17
    {
18
        return static::getPublicProperties();
19
    }
20
21
    public function getTemplateModel(): string
22
    {
23
        return static::$templateModel;
24
    }
25
26
    protected function buildView()
27
    {
28
        $renderer = $this->getMailTemplateRenderer();
29
30
        $viewData = $this->buildViewData();
31
32
        $html = $renderer ->render($viewData);
33
34
        $text = $renderer->renderTextView($viewData);
35
36
        return array_filter([
37
            'html' => new HtmlString($html),
38
            'text' => $text,
39
        ]);
40
    }
41
42
    protected function buildSubject($message)
43
    {
44
        if ($this->subject) {
45
            $message->subject($this->subject);
46
47
            return $this;
48
        }
49
50
        if (MailTemplate::findForMailable($this)->subject)
51
        {
52
            $subject = $this
53
                ->getMailTemplateRenderer()
54
                ->renderSubject($this->buildViewData());
55
56
            $message->subject($subject);
57
58
            return $this;
59
        }
60
61
        return parent::buildSubject($message);
62
    }
63
64
    public function getLayout(): ?string
65
    {
66
        return null;
67
    }
68
69
    public function build()
70
    {
71
        return $this;
72
    }
73
74
    protected static function getPublicProperties(): array
75
    {
76
        $class = new ReflectionClass(static::class);
77
78
        return collect($class->getProperties(ReflectionProperty::IS_PUBLIC))
79
            ->map->getName()
80
            ->diff(static::getIgnoredPublicProperties())
81
            ->values()
82
            ->all();
83
    }
84
85
    protected static function getIgnoredPublicProperties(): array
86
    {
87
        $mailableClass = new ReflectionClass(Mailable::class);
88
        $queueableClass = new ReflectionClass(Queueable::class);
89
90
        return collect()
91
            ->merge($mailableClass->getProperties(ReflectionProperty::IS_PUBLIC))
92
            ->merge($queueableClass->getProperties(ReflectionProperty::IS_PUBLIC))
93
            ->map->getName()
94
            ->values()
95
            ->all();
96
    }
97
98
    protected function getMailTemplateRenderer(): TemplateMailableRenderer
99
    {
100
        return app(TemplateMailableRenderer::class, ['templateMailable' => $this]);
101
    }
102
}
103