用自定义覆盖sendSwiftMessage()Laravel Swiftmailer

时间:2016-09-27 13:18:54

标签: laravel laravel-4

我使用的是Laravel 4.2

user3158900给出的答案适用于Laravel 5。* 任何人都可以帮我4.2版本吗?

我想用自己的函数覆盖sendSwiftMessage()受保护的函数。

sendSwiftMessage()位于

  

"供应商/ laravel /框架/ SRC /照亮/邮件/ Mailer.php"

我创建了一个

  

LIB /邮寄者/ CustomMailer.php

并将文件夹Lib设置为composer(PSR4)中的自动加载。 我现在可以通过写:

在我的控制器中调用/加载我的函数
  

new Lib \ Mailer \ CustomMailer;

这就是我的文件的样子:

<?php namespace Lib\Mailer;

class CustomMailer extends \Illuminate\Mail\Mailer {

    /**
     * Send a Swift Message instance.
     *
     * @param  \Swift_Message  $message
     * @return void
     */
    protected function sendSwiftMessage($message)
    {
        if (strpos($message->toString(), 'noemail@noemail.com') == true) {
            Log::info('Not sending mail to noemail@noemail.com');
        }
        else
        {
            if ($this->events)
            {
                $this->events->fire('mailer.sending', array($message));
            }

            if ( ! $this->pretending)
            {
                $this->swift->send($message, $this->failedRecipients);
            }
            elseif (isset($this->logger))
            {
                $this->logMessage($message);
            }
        }
    }

}

但是,当我通过示例在控制器中发送带有Swiftmailer的电子邮件时,不会使用此sendSwiftMessage()函数:

Mail::send(xxxx); 

我的问题:如果我不想修改当前使用Mail的所有控制器,如何在发送邮件时使Swiftmailer / Laravel使用我的自定义sendSwiftMessage()函数:: send()代码

1 个答案:

答案 0 :(得分:0)

想想我弄明白这一点,但是我收到了一个错误,但我认为这是因为你的自定义类使用的是一个不存在的属性,所以这里的解决方案无论如何

AppServiceProvider.php方法的boot()中,我添加了以下内容:

$this->app->singleton('customMailer', function($app) {
    return new CustomMailer(
        $app['view'], $app['swift.mailer'], $app['events']
    );
});

app/Lib/Mailer文件夹中,我为立面添加了另一个类。

namespace App\Lib\Mailer;

use Illuminate\Support\Facades\Facade;

class Mail extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'customMailer';
    }
}

config/app.php中,我已将Mail别名替换为以下内容......

'Mail' => App\Lib\Mailer\Mail::class,

这应该就是你需要做的一切。

另外一件事,我刚刚注意到你的命名空间遗漏了App,这解释了为什么你必须将Lib文件夹添加到自动加载器。如果您通过在开头添加App\来正确命名它以使其与PSR-4保持内联,那么您不需要向composer.json文件添加任何内容以获取其他类加载。