Won*_*nka 7 php laravel laravel-5 laravel-queue laravel-5.5
我和一些听众有一个laravel事件.一些侦听器或它们的通知(取决于它们是否耗时)正在实现ShouldQueue
它们,因此它们在redis
队列的后台运行.该事件SerializesModels
默认使用,但是当事件的一个传递模型是登录用户并且我们触发它时,如下所示:
$user = $this->user(); // logged in user instance
event(new UserCreatedPost($user, $post, $modelX, $modelY));
Run Code Online (Sandbox Code Playgroud)
我无法在相应的侦听器中访问用户的关注者,以检查是否存在以通知他们:
// In listener handle method
public function handle(UserCreatedPost $event){
$followers = $event->user->followers()->get();
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Call to undefined method Illuminate\Contracts\Database\ModelIdentifier::followers()
Run Code Online (Sandbox Code Playgroud)
我能够让它工作的唯一方法是在下面添加事件唤醒:
public function handle(UserCreatedPost $event){
// This fixes it, as it unserializes all the models
// (even though we only need this model to be unserialized, not all of them)
$event->__wakeup();
$followers = $event->user->followers()->first();
// If at least one follower exists send queued notification
// else exit
}
Run Code Online (Sandbox Code Playgroud)
我确实$user
在同一事件和其他事件监听器下的一些其他监听器中使用该实例.我甚至不知道是否$user
应该首先序列化,但它是一个模型,所以父事件SerializesModels
特征自动序列化所有模型(我不知道有什么方法可以使这个特定的模型不被序列化,而其他模型是).
是否有更好的方法可以访问$user
监听器而无需进行wakeup
呼叫?我有许多与侦听器的事件,现在只需要实现队列,所以我真的不想将它添加wakeup
到错误出现的所有文件的所有区域,但我确实想要排队一些侦听器或他们的通知.另一种方法是 删除事件SerializesModels
特征,甚至不担心在我或尚未发现此错误的情况下出现的错误.是否存在任何可能出现的问题,例如性能或其他问题,通过实施替代方法?有更好的方法吗?
__wakeup()
(在中定义SerializesModels
)(实际上是在框架中进行反序列化以执行其排队的侦听器时)由框架调用。此特征的全部目的在于,它仅将模型标识符存储在序列化的字符串中(而不存储在其他属性中),并且在未序列化时从数据库中重新加载模型。这样做是为了节省队列中的空间,而且还因为队列处理被延迟并且属性可能会更改。因此,您永远不需要序列化整个模型及其所有属性来进行队列处理。
这也意味着,您可以根据需要手动执行相同的操作。无需将模型对象传递给事件,您只需传递一些标识符给事件并自己加载模型即可(这不多Model::find($id)
,对吧?)。
$user = $this->user(); // logged in user instance
event(new UserCreatedPost($user->id, $post->id, $modelX->id, $modelY->id));
Run Code Online (Sandbox Code Playgroud)
在听众中:
// In listener handle method
public function handle(UserCreatedPost $event){
$user = User::find($event->user);
$followers = $user->followers()->get();
// the other stuff you want to do...
}
Run Code Online (Sandbox Code Playgroud)
我必须承认,我对排队的事件侦听器还不熟悉,只对排队的作业和类似的东西不熟悉。但是根据您的描述,我会说框架中的某个地方可能存在错误。实际排队的不是侦听器,而是调用侦听器的作业,称为CallQueuedListener
。
如果采取Laravel用于排队侦听器的行为,则您自己也可以使用相同的方法:不要将事件侦听器排队,而是让侦听器创建发送通知的排队作业。也许这更好。
归档时间: |
|
查看次数: |
1562 次 |
最近记录: |