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

Ter*_*ion 6 php email laravel

我使用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)

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


Rol*_*olf 5

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

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

Mail::fake()
Run Code Online (Sandbox Code Playgroud)