Passed
Push — master ( 696cbf...968eef )
by Melech
05:53 queued 01:56
created

ServiceProvider::publishPhpMailerClient()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 39
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 19
dl 0
loc 39
rs 9.6333
c 0
b 0
f 0
cc 2
nc 2
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Valkyrja Framework package.
7
 *
8
 * (c) Melech Mizrachi <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Valkyrja\Mail\Provider;
15
16
use GuzzleHttp\Client;
17
use Mailgun\HttpClient\HttpClientConfigurator;
18
use Mailgun\Mailgun;
19
use PHPMailer\PHPMailer\PHPMailer as PHPMailerClient;
20
use Valkyrja\Application\Env;
0 ignored issues
show
Bug introduced by
The type Valkyrja\Application\Env was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
21
use Valkyrja\Container\Contract\Container;
22
use Valkyrja\Container\Support\Provider;
23
use Valkyrja\Log\Contract\Logger;
24
use Valkyrja\Mail\Contract\Mailer;
25
use Valkyrja\Mail\LogMailer;
26
use Valkyrja\Mail\MailgunMailer;
27
use Valkyrja\Mail\NullMailer;
28
use Valkyrja\Mail\PhpMailer;
29
30
/**
31
 * Class ServiceProvider.
32
 *
33
 * @author Melech Mizrachi
34
 */
35
final class ServiceProvider extends Provider
36
{
37
    /**
38
     * @inheritDoc
39
     */
40
    public static function publishers(): array
41
    {
42
        return [
43
            Mailer::class                 => [self::class, 'publishMailer'],
44
            MailgunMailer::class          => [self::class, 'publishMailgunMailer'],
45
            Mailgun::class                => [self::class, 'publishMailgun'],
46
            HttpClientConfigurator::class => [self::class, 'publishMailgunHttpClientConfigurator'],
47
            PhpMailer::class              => [self::class, 'publishPhpMailer'],
48
            PHPMailerClient::class        => [self::class, 'publishPhpMailerClient'],
49
            LogMailer::class              => [self::class, 'publishLogMailer'],
50
            NullMailer::class             => [self::class, 'publishNullMailer'],
51
        ];
52
    }
53
54
    /**
55
     * @inheritDoc
56
     */
57
    public static function provides(): array
58
    {
59
        return [
60
            Mailer::class,
61
            MailgunMailer::class,
62
            Mailgun::class,
63
            HttpClientConfigurator::class,
64
            PhpMailer::class,
65
            PHPMailerClient::class,
66
            LogMailer::class,
67
            NullMailer::class,
68
        ];
69
    }
70
71
    /**
72
     * Publish the mailer service.
73
     */
74
    public static function publishMailer(Container $container): void
75
    {
76
        $container->setSingleton(
77
            Mailer::class,
78
            $container->getSingleton(MailgunMailer::class),
79
        );
80
    }
81
82
    /**
83
     * Publish the mailgun mailer service.
84
     */
85
    public static function publishMailgunMailer(Container $container): void
86
    {
87
        $env = $container->getSingleton(Env::class);
88
        /** @var non-empty-string $domain */
89
        $domain = $env::MAIL_MAILGUN_DOMAIN;
90
91
        $container->setSingleton(
92
            MailgunMailer::class,
93
            new MailgunMailer(
94
                $container->getSingleton(Mailgun::class),
95
                $domain
96
            )
97
        );
98
    }
99
100
    /**
101
     * Publish the mailgun service.
102
     */
103
    public static function publishMailgun(Container $container): void
104
    {
105
        $container->setSingleton(
106
            Mailer::class,
107
            new Mailgun(
108
                $container->getSingleton(HttpClientConfigurator::class),
109
            )
110
        );
111
    }
112
113
    /**
114
     * Publish the mailgun service.
115
     */
116
    public static function publishMailgunHttpClientConfigurator(Container $container): void
117
    {
118
        $env = $container->getSingleton(Env::class);
119
        /** @var string $apiKey */
120
        $apiKey = $env::MAIL_MAILGUN_API_KEY;
121
122
        $container->setSingleton(
123
            HttpClientConfigurator::class,
124
            (new HttpClientConfigurator())
125
                ->setApiKey($apiKey)
126
                ->setHttpClient(new Client())
127
        );
128
    }
129
130
    /**
131
     * Publish the PHPMailer mailer service.
132
     */
133
    public static function publishPhpMailer(Container $container): void
134
    {
135
        $container->setSingleton(
136
            PhpMailer::class,
137
            new PhpMailer(
138
                $container->getSingleton(PHPMailerClient::class),
139
            ),
140
        );
141
    }
142
143
    /**
144
     * Publish the PHPMailer client service.
145
     */
146
    public static function publishPhpMailerClient(Container $container): void
147
    {
148
        $env = $container->getSingleton(Env::class);
149
        /** @var bool $debugMode */
150
        $debugMode = $env::APP_DEBUG_MODE;
151
        /** @var string $host */
152
        $host = $env::MAIL_PHP_MAILER_HOST;
153
        /** @var int $port */
154
        $port = $env::MAIL_PHP_MAILER_PORT;
155
        /** @var string $username */
156
        $username = $env::MAIL_PHP_MAILER_USERNAME;
157
        /** @var string $password */
158
        $password = $env::MAIL_PHP_MAILER_PASSWORD;
159
        /** @var string $encryption */
160
        $encryption = $env::MAIL_PHP_MAILER_ENCRYPTION;
161
162
        // Create a new instance of the PHPMailer class
163
        $mailer = new PHPMailerClient(true);
164
165
        // Enable verbose debug output
166
        $mailer->SMTPDebug = $debugMode ? 2 : 0;
167
        // Set mailer to use SMTP
168
        $mailer->isSMTP();
169
        // Specify main and backup SMTP servers
170
        $mailer->Host = $host;
171
        // SMTP Port
172
        $mailer->Port = $port;
173
        // Enable SMTP authentication
174
        $mailer->SMTPAuth = true;
175
        // SMTP username
176
        $mailer->Username = $username;
177
        // SMTP password
178
        $mailer->Password = $password;
179
        // Enable TLS encryption, `ssl` also accepted
180
        $mailer->SMTPSecure = $encryption;
181
182
        $container->setSingleton(
183
            PHPMailerClient::class,
184
            $mailer
185
        );
186
    }
187
188
    /**
189
     * Publish the log mailer service.
190
     */
191
    public static function publishLogMailer(Container $container): void
192
    {
193
        $container->setSingleton(
194
            LogMailer::class,
195
            new LogMailer(
196
                $container->getSingleton(Logger::class),
197
            ),
198
        );
199
    }
200
201
    /**
202
     * Publish the null mailer service.
203
     */
204
    public static function publishNullMailer(Container $container): void
205
    {
206
        $container->setSingleton(
207
            NullMailer::class,
208
            new NullMailer(),
209
        );
210
    }
211
}
212