【问题标题】:Disable Laravel email during db seed在数据库种子期间禁用 Laravel 电子邮件
【发布时间】:2014-10-23 23:42:20
【问题描述】:

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

将其放入播种机中:

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

没有效果。我不明白为什么。我将它放在根 DatabaseSeeder@run 或/和子播种机中 - 相同。对 Mandrill 的调用仍在执行。

这个问题有解决办法吗?

【问题讨论】:

  • 您说您是在部署后进行部署和播种,但测试与此有什么关系?您是否正在测试并且测试正在启动种子程序?或者您正在使用不同的命令进行播种和测试?
  • Config::get('mail.pretend'); 返回真?
  • @AntonioCarlosRibeiro 测试是测试,它们之前在不同的环境中运行,并且邮件设置为在环境级别假装。该主题是关于项目的暂存版本,其中包含虚假内容以“查看”

标签: php email laravel


【解决方案1】:

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

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

Mail::fake()

【讨论】:

  • 在 5.7 上对我不起作用,仍然将电子邮件发送到 mailtrap 更新:因为我使用工作来处理电子邮件而不是 Mail::fake() 我必须使用 Bus::fake()
  • 嗨,克劳迪奥。如果您使用队列来处理您的电子邮件,您可以断言是否有作业(使用 Queue::fake()Queue::assertPushed(YourJob::class))被推送到队列并为您的作业创建单独的测试。
【解决方案2】:

你的原因

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

不工作是因为邮件对象在发送邮件之前没有检查这些值。 哇啊啊啊?。如果你看一下mailer类中的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 启动并注册每个服务提供者时,它最终会注册邮件服务提供者,那就是当它读取配置时,然后告诉邮件程序它是否应该“假装”。当您在播种机中调用它时,邮件程序已经加载了它的配置值。

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

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

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

【讨论】:

  • 太棒了!谢谢你。我认为邮件程序的行为不是很明显,所以你的回答非常有用。
  • 这不再有效(从 Laravel 5.7 开始)。请查收:stackoverflow.com/a/53303732/1572330
【解决方案3】:

我觉得有两种可能,你可以试试:

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

    Mail::pretend();

  2. 数据库种子正在运行多个请求:

照原样写here:

在运行时设置的配置值仅为 当前请求,不会被转移到后续请求中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 2015-02-04
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多