使用Laravel Mail :: later时,对象丢失

时间:2014-01-23 04:24:33

标签: laravel queue

我有这段代码:

$data = ['user'=>User::find(1)];
Mail::later(5, 'email.template', $data, function($message){
  ...
})

email.template有这个:

print_r($user)

当我收到电子邮件时,$ user的实例不是User对象。怎么会发生这种情况?就好像对象没有引用正确的上下文。但是当我使用Mail :: send时它工作正常。这里有点困惑。

3 个答案:

答案 0 :(得分:11)

Eloquent模型对于队列的工作而言太大了,通常限制为64kb。

我建议您使用常规队列作业,将其传递给您的用户ID,然后从那里发送电子邮件:

$user_id = 1;

Queue::later(5, function () use ($user_id) {
    $data = ['user' => User::find($user_id)];

    Mail::send('email.template', $data, function ($message) {
        // ......
    });
});

答案 1 :(得分:3)

我对其他两个回答者采取了类似的方法,但我使用视图创建者实现了它。我能够使用$ view-> getData()从视图中检索变量,并从中检索了Eloquent模型。您可以将以下内容与Mail :: later或Mail :: queue一起使用。

View::creator('email.template', function($view)
{
    $view_data = $view->getData();

    if (isset($view_data['user_id']))
    {
        $user_id = $view_data['user_id'];
        $view->with('user', User::find(user_id));
    }
});

答案 2 :(得分:2)

序列化Eloquent模型可能有点棘手。最安全的方法是将ID传递给Mail队列,并在它返回时检索它:

$data = ['user_id' => 1];
Mail::later(5,'email.template', $data, function ($message) {
   ...
});

在你的模板中(靠近顶部):

<?php $user = User::find($user_id); ?>

.. rest of template

或者,正如IRC上的其他人建议的那样,完全跳过Mail::later()并改为使用Queue::later()。编写自己的处理程序,从ids中检索模型,然后触发Mail::send()