我使用Mandrill邮件驱动程序进行测试.我有一个远程登台,我在部署后播种.在播种期间,我尝试禁用与某些事件相关联的电子邮件发送.
将它放在播种机中:
Config::set('mail.driver', 'log');
Config::set('mail.pretend', true);
没有效果.我不明白为什么.我把它放在根DatabaseSeeder@run
或/和儿童播种机中 - 相同.仍在执行对Mandrill的调用.
有这个问题的解决方案吗?
Ala*_*orm 11
你原因
Config::set('mail.driver', 'log');
Config::set('mail.pretend', true);
Run Code Online (Sandbox Code Playgroud)
不起作用是因为邮件对象在发送邮件之前不检查这些值. Whaaaaaaaa?.如果你看一下sendSwiftMessage
邮件程序类中的方法
#File: vendor/laravel/framework/src/Illuminate/Mail/Mailer.php
protected function sendSwiftMessage($message)
{
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在决定是否应该发送邮件之前$this->pretending
,您可以查看类检查,而不是配置.什么设置pretending
?这是MailServiceProvider
班级的register
方法.
public function register()
{
//...
$pretend = $app['config']->get('mail.pretend', false);
$mailer->pretend($pretend);
//...
}
Run Code Online (Sandbox Code Playgroud)
当Laravel启动,并将每个注册服务提供商,它最终注册邮件服务提供商和这时候它会读取配置,然后告诉邮件是否应该"假装"与否.当你在播种机中调用它时,邮件程序已经加载了它的配置值.
幸运的是,这是一个非常简单的解决方案.邮件程序对象是单例/共享服务,并且具有可用于控制是否应该伪装的公共方法.只需pretend
自己调用方法,而不是设置配置值
Mail::pretend(true); //using the `Mail` facade to access the mailer object.
Run Code Online (Sandbox Code Playgroud)
你应该能够以编程方式关闭邮件程序.
这是Laravel 5.7的答案,因为假装不存在:
如果您想在播种数据库时禁用邮件,则可以简单地“滥用”
Mail::fake()
Run Code Online (Sandbox Code Playgroud)