我正在尝试Mail::queue(),这就是我正在做的:
这是向我发送电子邮件的类
class Email {
public static function send($user, $view, $subject) {
Mail::queue($view, array('user' => $user), function($m) use ($user, $subject) {
$m->to($user->email)->subject($subject);
});
Log::info("Mail [$subject] sent to $user->email");
}
}
这是调用marshal()的人
class QueueController extends BaseController {
public function push()
{
Log::info('[queue.push] Queue::marshal() called');
return Queue::marshal();
}
}
我是这样称呼它的:
Email::send($user, 'site.users.emailRegistered', 'Activate your account');
这是我试图渲染为电子邮件消息的视图:
<!DOCTYPE html>
<html lang="en-US">
<head><meta charset="utf-8"></head>
<body>
<h2>Hi,</h2>
<div>
Please, click the link to activate your account: {{ URL::route('activate', array($user->id,$user->getActivationCode())) }}
</div>
</body>
</html>
问题是Mail::send()工作正常,但当我使用Mail::queue()和marshal()被触发时,我在日志中得到一堆与"试图获得非对象的属性"相关的错误行。
显然我的数据没有被正确序列化,因为我传递了一些实例化的模型给它,但我如何正确序列化它?
我已经尝试创建一个$data数组,并将所有内容放在其中,然后将其传递给Mail::queue(),没有运气
嗯…不幸的是,我被迫改变了只使用Mail::queue()的计划,但仍然让它工作得很好,下面是代码:
class Email {
public static function queue($user, $view, $subject) {
$userId = $user->id;
$data = compact('userId', 'view', 'subject');
Queue::push(function($job) use ($data) {
$user = Sentry::getUserProvider()->findById($data['userId']);
Email::send($user, $data['view'], $data['subject']);
});
Log::info("Mail [$subject] QUEUED to $user->email");
}
public static function send($user, $view, $subject) {
Mail::send($view, ['user' => $user], function($m) use ($user, $subject) {
$m->to($user->email)->subject($subject);
});
Log::info("Mail [$subject] SENT to $user->email");
}
}
当然还有改进要做,比如使用Queue:later(),但我仍然不需要它们,我只是保持它干燥。