【问题标题】:Override sendSwiftMessage() Laravel Swiftmailer with custom用自定义覆盖 sendSwiftMessage() Laravel Swiftmailer
【发布时间】:2017-02-05 03:34:37
【问题描述】:

我使用的是 Laravel 4.2

user3158900 给出的答案是针对 Laravel 5.* 任何人都可以帮助我使用 4.2 版吗?

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

sendSwiftMessage() 位于

“供应商/laravel/framework/src/Illuminate/Mail/Mailer.php”

我创建了一个

Lib/Mailer/CustomMailer.php

并将文件夹 Lib 设置为在 composer (PSR4) 中自动加载。 我现在可以通过以下方式在我的控制器中调用/加载我的函数:

新的 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() 函数:发送()代码

【问题讨论】:

  • user3158900 的答案是针对 Laravel 5.* 任何人都可以帮助我使用 4.2 版吗?

标签: laravel laravel-4


【解决方案1】:

我想我已经解决了这个问题,但是我收到了一个错误,但我认为这是你的问题,因为你的自定义类正在使用一个不存在的属性,所以无论如何这就是解决方案。

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

$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 文件添加任何内容来加载其他类。

【讨论】:

  • 能否请您告诉我 AppServiceProvider.php 的位置和文件的开头,谢谢!!我现在正在尝试,但仍然卡在那里
  • 哦,你使用的是 Laravel 4。很抱歉,这段代码可能不起作用。
猜你喜欢
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 2019-02-12
相关资源
最近更新 更多