如何将变量传递给不是类实例的事件?

时间:2017-01-28 15:11:49

标签: php laravel events laravel-5.3

当有人在我的系统上收藏实体时,我会触发一个事件。这是使用Event::fire(new AddedAsFav($entity_id));

触发的

在那种情况下,我想提取一些关于$entity_id的信息。要做到这一点,我相信我需要传递$entity_id作为我的监听器的构造函数的一部分,然后我可以访问它。不幸的是构造函数需要一个类型,我似乎无法传递一个整数。文档中有许多示例,它们传递Eloquent ORM实例,例如,前缀为类的名称(Entity $entity)。但我不想传递一个完整的对象,只是一个ID,因为它来自的控制器只有一个ID。我宁愿在事件本身中进行查询(这是昂贵且耗时的,因此事件)。

那么如何传递和访问基本的int?

这是我的听众:

<?php

namespace App\Listeners;

use App\Events\AddedAsFav;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class GetFullEntity
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct(int $entity_id)
    {
        $this->entity_id = $entity_id;
    }

    /**
     * Handle the event.
     *
     * @param  MovieAddedAsToWatch  $event
     * @return void
     */
    public function handle(AddedAsFav $event)
    {
        dd($event);
    }
}

2 个答案:

答案 0 :(得分:1)

如果您事件文件中有public $entity_id,那么您将能够在倾听者的 handle方法中获取该值,就像这样:$event->entity_id

答案 1 :(得分:1)

您只需输入您可能想要在侦听器中使用的某些内容。

如果您只想访问传递给事件类的数据/对象/数组,请将其分配给事件类中的公共属性:

class AddedAsFav extends Event
{

    public $entity_id;

    public function __construct($entity_id)
    {

        $this->entity_id = $entity_id;

    }
}

您现在可以像在任何属性中一样在监听器中访问它:

<?php

namespace App\Listeners;

use App\Events\AddedAsFav;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class GetFullEntity
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {

    }

    /**
     * Handle the event.
     *
     * @param  MovieAddedAsToWatch  $event
     * @return void
     */
    public function handle(AddedAsFav $event)
    {
        $entity_id = $event->entity_id;
    }
}