在db种子期间禁用Laravel电子邮件

时间:2014-08-29 22:36:12

标签: php email laravel

我使用Mandrill邮件驱动程序进行测试。我有一个远程登台,我在部署后播种。在播种期间,我尝试禁用与某些事件相关联的电子邮件发送。

将其放置在播种机中:

Config::set('mail.driver', 'log'); Config::set('mail.pretend', true);

无效。我不明白为什么。我把它放在根DatabaseSeeder@run或/和儿童播种机中 - 相同。仍在执行对Mandrill的调用。

这个问题有解决方案吗?

3 个答案:

答案 0 :(得分:11)

你的原因

Config::set('mail.driver', 'log');
Config::set('mail.pretend', true);

不起作用是因为邮件对象在发送邮件之前不检查这些值。的 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);
    }
}

在决定是否应该发送邮件之前,您可以看到班级检查$this->pretending配置。什么设置pretending?这是在MailServiceProvider类的register方法中。

public function register()
{
    //...
    $pretend = $app['config']->get('mail.pretend', false);
    $mailer->pretend($pretend);
    //...
}

当Laravel启动并注册每个服务提供商时,它最终会在读取配置时注册邮件服务提供商和那个,然后告诉邮件者是否应该“假装”。当你在播种机中调用它时,邮件程序已经加载了它的配置值。

幸运的是,有一个非常简单的解决方案。邮件程序对象是单例/共享服务,并且具有可用于控制是否应该伪装的公共方法。只需自己调用pretend方法,而不是设置配置值

Mail::pretend(true); //using the `Mail` facade to access the mailer object. 

你应该能够以编程方式关闭邮件程序。

答案 1 :(得分:5)

这是Laravel 5.7的答案,因为假装不存在:

如果您想在播种数据库时禁用邮件,则可以简单地“滥用”

Mail::fake()

答案 2 :(得分:2)

我认为有两种可能性,你可以尝试:

  1. 您可以设置命令以即时启用邮件假装:

    Mail::pretend();

  2. db种子正在运行多个请求:

  3. 正如写here

      

    仅在运行时设置的配置值   当前请求,不会转发给后续请求。

    因此,您可以尝试将此配置设置为请求(如会话),而不是在播种结束时完成。