我的应用程序中有一个事件设置,它在用户注册时发送激活电子邮件。它在没有ShouldQueue
接口的情况下可以完美工作。然而,当我添加implements ShouldQueue
时,我得到了未定义的属性错误:
未定义的属性:App''Events''User''UserCreated::$User
我使用的代码如下:
<?php
namespace App'Listeners'User;
use App'Events'User'UserCreated;
use Illuminate'Queue'InteractsWithQueue;
use Illuminate'Contracts'Queue'ShouldQueue;
use App'Repos'Email'EmailTemplateRepoInterface;
use App'Repos'User'UserRepoInterface;
use Request, Mail, DbView;
class UserCreatedEmail implements ShouldQueue
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct(EmailTemplateRepoInterface $template)
{
$this->template = $template;
}
/**
* Handle the event.
*
* @param UserCreated $event
* @return void
*/
public function handle(UserCreated $event)
{
$user = $event->user;
if($user)
{
if(!$user->status)
{
$user->activation_url = Request::root().'/activate/'.$user->activation_code;
$template = $this->template->findTemplateByName('new_user_activation');
$userArr = $user->toArray();
}
Mail::queue([], [], function ($message) use ($template, $userArr)
{
$message->to($userArr['email'])
->subject($template->subject)
->setBody(DbView::make($template)->with($userArr)->render(), 'text/html');
});
}
}
}
编辑
这也是UserCreated
类:
<?php
namespace App'Events'User;
use App'Events'Event;
use Illuminate'Queue'SerializesModels;
use Illuminate'Contracts'Broadcasting'ShouldBroadcast;
class UserCreated extends Event
{
use SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($user, $row, $request)
{
$this->user = $user;
$this->request = $request;
$this->row = $row;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
有人能解释为什么当我尝试对电子邮件进行排队时会发生这种情况吗
您需要将属性明确定义为public
。即
class UserCreated extends Event
{
use SerializesModels;
public $user;
...
就像rdiz说的那样,添加一个public
或protected
属性。如果您仍然遇到问题,请注意Laravel Event有一些保留属性,如sessionId
和message
。将我的参数名称更改为sessionId_
为我解决了这个问题。