我使用的是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()代码
答案 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
文件添加任何内容以获取其他类加载。