我有这段代码:
$data = ['user'=>User::find(1)];
Mail::later(5, 'email.template', $data, function($message){
...
})
email.template
有这个:
print_r($user)
当我收到电子邮件时,$ user的实例不是User对象。怎么会发生这种情况?就好像对象没有引用正确的上下文。但是当我使用Mail :: send时它工作正常。这里有点困惑。
答案 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()
。