Laravels の Mail のクラス ファサード メソッド send をオーバーライドしたい (いくつかのチェックを強制的にインターセプトし、それがパスした場合はトリガーの parent::send())
これを行う最善の方法は何ですか?
Laravels の Mail のクラス ファサード メソッド send をオーバーライドしたい (いくつかのチェックを強制的にインターセプトし、それがパスした場合はトリガーの parent::send())
これを行う最善の方法は何ですか?
ファサードはそのようには機能しません。基本的には、それが表す基礎となるクラスを呼び出すラッパー クラスのようなものです。
ファサードには実際にはメソッドMail
がありません。send
内部ではMail::send()
、「ファサード アクセサー」を使用してIlluminate\Mail\Mailer
、IoC コンテナーにバインドされたクラスのインスタンスを参照します。send
メソッドが呼び出されるのはそのオブジェクト上です。
求めているものを達成する方法は、実際には見た目よりも少しトリッキーです。あなたができることは次のとおりです。
Mailer
拡張する の独自の実装を記述します。Illuminate\Mail\Mailer
send
parent::send()
Illuminate\Mail\MailServiceProvider
) を作成し、特にメソッドを再実装しregister
ます。Mailer
Laravel 独自のインスタンスの代わりに独自のインスタンスを作成する必要があります。(ほとんどのコードは Laravel のregister
メソッドからコピーできます)。config/app.php
ファイル内の配列を独自のプロバイダーproviders
に置き換えます。Illuminate\Mail\MailServiceProvider::class,
これにより、Laravel のメール機能に接続できるようになります。
詳細については、同様のことを達成する次の質問/回答をご覧ください。Mail 機能を拡張して新しいトランスポート ドライバを追加しますが、独自の Mailer 実装とサービス プロバイダを提供するという点で同様のアプローチをとっています。
Laravel のメーラーに新しいトランスポート ドライバーを追加する
app/MyMailer/Mailer.php
<?php
namespace App\MyMailer;
class Mailer extends \Illuminate\Mail\Mailer
{
public function send($view, array $data = [], $callback = null)
{
// Do your checks
return parent::send($view, $data, $callback);
}
}
app/MyMailer/MailServiceProvider.php (Laravel の MailServiceProvider クラスからコピーされたほとんどのコード)
<?php
namespace App\MyMailer;
class MailServiceProvider extends \Illuminate\Mail\MailServiceProvider
{
public function register()
{
$this->registerSwiftMailer();
$this->app->singleton('mailer', function ($app) {
// This is YOUR mailer - notice there are no `use`s at the top which
// Looks for a Mailer class in this namespace
$mailer = new Mailer(
$app['view'], $app['swift.mailer'], $app['events']
);
$this->setMailerDependencies($mailer, $app);
$from = $app['config']['mail.from'];
if (is_array($from) && isset($from['address'])) {
$mailer->alwaysFrom($from['address'], $from['name']);
}
$to = $app['config']['mail.to'];
if (is_array($to) && isset($to['address'])) {
$mailer->alwaysTo($to['address'], $to['name']);
}
return $mailer;
});
}
}
config/app.php (プロバイダー配列内)
//...
// Illuminate\Mail\MailServiceProvider::class,
App\MyMailer\MailServiceProvider::class,
//...