【问题标题】:Laravel notification sent with no content and wrong subject发送的 Laravel 通知没有内容和错误的主题
【发布时间】:2019-03-06 03:41:04
【问题描述】:

我已在app/Notifications 中创建此通知:

class StatisticsExportNotification extends Notification implements ShouldQueue
{
    use Queueable;
    use EmailNotificationViewHTMLTrait;

    protected $links;

    /**
     * Create a new notification instance.
     *
     */
    public function __construct($links)
    {
        $this->links = $links;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return [
            MailChannel::class
        ];
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        list($subject, $viewData) = $this->getNotificationViewHTML('statistics_export', $notifiable, ['links' => $this->links]);

        return (new MailMessage())
            ->subject($subject)
            ->view('mail.main', compact('viewData'));
    }
}

我正在尝试这样发送:

$member->notify(
        new StatisticsExportNotification('testing')
    );

现在,电子邮件 HTML 模板的内容只是:

{{links}}

但我已经确认,如果 HTML 只是一个硬编码字符串并且我不尝试将任何变量传递给它,则会出现同样的问题。

那个问题是,在我看来 toMail 方法在这里根本没有被调用。当我在类构造函数中执行logger()->debug($links) 时,它会记录变量的值。但是当我在toMail() 中执行logger()->debug('test') 时,它不会记录任何内容!

如果我在方法中对主题和内容进行硬编码,则没有区别:

public function toMail($notifiable)
    {
        $subject = "foo";
        $viewData = ["test" => "bar"];

        return (new MailMessage())
            ->subject($subject)
            ->view('mail.main', compact('viewData'));
    }

无论我做什么,系统都会将通知发送到会员的邮箱,但主题是“统计导出通知”,邮件正文为空!

getNotificationViewHTML 所做的是获取消息模板并使用我们传递给它的数据填充它,但同样,这段代码似乎根本没有发挥作用。我也尝试在该方法中添加日志记录,甚至放入我知道如果执行会引发错误的代码,但无论我做什么,通知都会以相同的默认主题和相同的空正文发送。

【问题讨论】:

  • 你试过重启队列并运行 php artisan config:cache 吗?
  • 不,但这有什么帮助?我之前已经添加/编辑过通知,不需要重新启动任何东西。
  • 因为队列进程在你启动它后没有得到那个 cahnges。因此,当您重新启动它时,队列进程将加载更新的配置。我会建议尝试一次。
  • 试过了,没用。
  • 您可以在邮件模板中尝试使用 {{{ }}} 而不是 {{ }} 吗?

标签: laravel


【解决方案1】:

我尝试重新创建您的问题,我想我以某种方式做到了,但在您自己测试之前,我永远无法确定 100%。所以这里有一些建议:

1- 在测试时,尝试使用直接数组而不是紧凑来转换它

public function toMail($notifiable)
{
    $subject = "foo";
    $viewData = ["links" => "Here is the Links"];

    return (new MailMessage())
        ->subject($subject)
        ->view('mail.main', $viewData);
}

2- 在您的 mail.main 视图文件中,正确的语法应该包含带有 $ 的变量名:

{{ $links }}

不只是

{{ links }}

3- 可能是你真正的问题,确保你的视图文件有.blade.php,这样Blade就可以解析@section@yield{{$links}}等代码。你的邮件视图文件名应该是:

views/mail/main.blade.php

4- 更改统计通知文件中的任何代码后,不要忘记重新启动队列代码。这应该成功设置$subject

php artisan queue:restart

然后重新开始

php artisan queue:work  --tries=3

【讨论】:

  • 我认为您没有理解这里问题的核心。 toMail() 函数从未被考虑在内!现在忘记模板,如果我在 toMail 中硬编码主题和标题,然后重新启动队列,然后再试一次,仍然没有任何变化!它始终是相同的通用标题和相同的空电子邮件正文。
  • @jovan 你有没有尝试过一个使用不同 Laravel 版本的空项目,看看它是否是一个错误?因为我在 Laravel 5.7.9 中轻松创建了您的案例,一切正常
【解决方案2】:

尝试用字符串数组替换您的 via 方法:

/**
 * Get the notification's delivery channels.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function via($notifiable)
{
    return ['mail'];
}

【讨论】:

    【解决方案3】:

    getNotificationViewHTML的定义是否返回数组[subject, html]?

    list 关键字解包数组的元素,从第 0 个元素开始。既然你说主题和内容都错了,那我的钱就在getNotificationViewHTML的返回值上。

    要测试,只需像这样对 getNotificationViewHTML 进行硬编码:

    public function getNotificationViewHTML()
    {
        return ["This Is the Subject", "<h1>This is My Message</h1>"];
    }
    

    如果您的邮件随后带有这些值,您需要调整您的 getNotificationViewHTML 返回值以匹配示例的格式。

    【讨论】:

      猜你喜欢
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2021-05-27
      • 2017-04-08
      • 2017-07-12
      • 2020-01-10
      相关资源
      最近更新 更多