8

Laravels の Mail のクラス ファサード メソッド send をオーバーライドしたい (いくつかのチェックを強制的にインターセプトし、それがパスした場合はトリガーの parent::send())

これを行う最善の方法は何ですか?

4

1 に答える 1

13

ファサードはそのようには機能しません。基本的には、それが表す基礎となるクラスを呼び出すラッパー クラスのようなものです。

ファサードには実際にはメソッドMailがありません。send内部ではMail::send()、「ファサード アクセサー」を使用してIlluminate\Mail\Mailer、IoC コンテナーにバインドされたクラスのインスタンスを参照します。sendメソッドが呼び出されるのはそのオブジェクト上です。

求めているものを達成する方法は、実際には見た目よりも少しトリッキーです。あなたができることは次のとおりです。

  • メソッドをオーバーライドし、チェックを実装して を呼び出すことができる、 をMailer拡張する の独自の実装を記述します。Illuminate\Mail\Mailersendparent::send()
  • 独自のサービス プロバイダー (Extending Illuminate\Mail\MailServiceProvider) を作成し、特にメソッドを再実装しregisterます。MailerLaravel 独自のインスタンスの代わりに独自のインスタンスを作成する必要があります。(ほとんどのコードは 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,
//...
于 2016-09-22T20:28:03.747 に答える