Completed
Push — master ( c4cb78...eafebf )
by
unknown
01:36
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 ReflectionClass;
6
use ReflectionProperty;
7
use Illuminate\Bus\Queueable;
8
use Illuminate\Mail\Mailable;
9
use Illuminate\Support\HtmlString;
10
use Spatie\MailTemplates\Models\MailTemplate;
11
use Spatie\MailTemplates\Interfaces\MailTemplateInterface;
12
13
abstract class TemplateMailable extends Mailable
14
{
15
    protected static $templateModelClass = MailTemplate::class;
16
17
    /** @var MailTemplateInterface */
18
    protected $mailTemplate;
19
20
    public static function getVariables(): array
21
    {
22
        return static::getPublicProperties();
23
    }
24
25
    public function getMailTemplate(): MailTemplateInterface
26
    {
27
        return $this->mailTemplate ?? $this->resolveTemplateModel();
28
    }
29
30
    protected function resolveTemplateModel(): MailTemplateInterface
31
    {
32
        return $this->mailTemplate = static::$templateModelClass::findForMailable($this);
33
    }
34
35
    protected function buildView()
36
    {
37
        $renderer = $this->getMailTemplateRenderer();
38
39
        $viewData = $this->buildViewData();
40
41
        $html = $renderer->render($viewData);
42
43
        return array_filter([
44
            'html' => new HtmlString($html),
45
            'text' => $this->textView ?? null,
46
        ]);
47
    }
48
49
    protected function buildSubject($message)
50
    {
51
        if ($this->subject) {
52
            $message->subject($this->subject);
53
54
            return $this;
55
        }
56
57
        if ($this->getMailTemplate()->subject()) {
58
            $subject = $this
59
                ->getMailTemplateRenderer()
60
                ->renderSubject($this->buildViewData());
61
62
            $message->subject($subject);
63
64
            return $this;
65
        }
66
67
        return parent::buildSubject($message);
68
    }
69
70
    public function getLayout(): ?string
71
    {
72
        return null;
73
    }
74
75
    public function build()
76
    {
77
        return $this;
78
    }
79
80
    protected static function getPublicProperties(): array
81
    {
82
        $class = new ReflectionClass(static::class);
83
84
        return collect($class->getProperties(ReflectionProperty::IS_PUBLIC))
85
            ->map->getName()
86
            ->diff(static::getIgnoredPublicProperties())
87
            ->values()
88
            ->all();
89
    }
90
91
    protected static function getIgnoredPublicProperties(): array
92
    {
93
        $mailableClass = new ReflectionClass(Mailable::class);
94
        $queueableClass = new ReflectionClass(Queueable::class);
95
96
        return collect()
97
            ->merge($mailableClass->getProperties(ReflectionProperty::IS_PUBLIC))
98
            ->merge($queueableClass->getProperties(ReflectionProperty::IS_PUBLIC))
99
            ->map->getName()
100
            ->values()
101
            ->all();
102
    }
103
104
    protected function getMailTemplateRenderer(): TemplateMailableRenderer
105
    {
106
        return app(TemplateMailableRenderer::class, ['templateMailable' => $this]);
107
    }
108
}
109