了解PHP事件分派系统

时间:2017-03-01 02:28:19

标签: php laravel events laravel-events

我从来没有在PHP中做任何事件驱动,只有Node.js,所以我试图理解事件调度系统如何在PHP中工作(例如Laravel events,{{3 }和CakePHP events)。

此示例位于Laravel文档中:

protected $listen = [
    'App\Events\OrderShipped' => [
        'App\Listeners\SendShipmentNotification',
    ],
];

由于在Apache上运行的PHP脚本的生命周期基本上是请求的生命周期,这是否意味着每个请求都会实例化所有事件侦听器?

因此,如果我的应用程序中有120个侦听器(即在此$listen属性中列出),那么每次访问页面时都会实例化120个侦听器吗?或者,只有在调度适当的事件时才会实例化侦听器对象?

在请求的整个持续时间内,甚至可能没有触发单个事件,对每个请求实例化侦听器似乎效率很低。

这是我甚至应该关注的事情吗?

1 个答案:

答案 0 :(得分:3)

事件监听器系统的工作原理。

简单来说,它只是一个文本对象数组。

所以在symfony你可能会做这样的事情

$eventManager->dispatch('my_cool_event_name', $eventPayload);

然后,只需执行数组查找,就会查找正在侦听事件my_cool_event_name的任何内容

$events = [
    'my_cool_event_name' => [
        'events\notifyController::email',
        'events\notifyController::text',
        'events\notifyController::tweet',
    ],
    'another_event' => [

    ]
];

因此,从上面的数组示例中,它发现有3个事件在my_cool_event_name上进行侦听,然后它会实现events\notifyController并运行通过$eventPayload的方法到每个事件。< / p>

如果您在执行期间从未派遣过my_cool_event_name,那么任何事情都无法实现