如何覆盖Laravel Facade方法?

时间:2016-09-22 19:24:06

标签: laravel laravel-facade

我想要覆盖Laravels'邮件的类门面方法发送(只是拦截它强制一些检查,然后如果它通过触发parent :: send())

最好的方法是什么?

1 个答案:

答案 0 :(得分:10)

Facade并不像那样工作。它本质上就像一个包装类,它调用它所代表的底层类。

Mail外观实际上没有send方法。当您在引擎盖下进行Mail::send()时,可以使用"外观访问器"用于引用IoC容器中绑定的Illuminate\Mail\Mailer类的实例。它在该对象上调用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实现和服务提供程序。

Add a new transport driver to Laravel's Mailer

应用/ 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&#39的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,
//...