Cakephp 和服务器端事件

Cakephp and Server Side Events

我已经用事件系统配置了 cakephp 2.6.3。 Post 数据通过控制器方法传入并得到处理。然后根据 documentation

将此数据传递到事件文件

侦听器正在注册事件,因为我可以从中写入日志。我有一个服务器发送事件设置,我想将结果数据从侦听器传递到此控制器方法,以便它可以作为事件发送。我该怎么做?

Post Data 'Mocked' up 事件用于在 DataController 中进行测试:- 我通过 URL 调用此方法来触发事件

public function test_event() {

    $data = array(
        'lat' => 'lattitude',
        'lng' => 'longigiggi',
        'msg' => 'my message here'
    );
    $this->autoRender = false;
    $this->layout = false;
    $event = new CakeEvent('Data.post.received', $this, array('data', $data));
    $this->getEventManager()->dispatch($event);

}

这是我在 Lib/Event/TradeData

中的事件监听器
public function implementedEvents() {
    return array(
        'Data.post.received' => 'fireThis',
    );
}

public function fireThis($event){
    CakeLog::write('debug', 'Event listener fired');

    //how do I pass data from the event here to a controller method
    // to propogate a server sent event in DataController->test_listener();
    // The event is being triggered, as its writing to the log
}

数据控制器::test_listener();

public function test_listener($data = null) {

    $trade = new EventController();
    $this->getEventManager()->attach($trade);

    $this->layout = false;

    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');

    $lat = $data['lat'];
    $lng = $data['lng'];
    $msg = $data['msg'];

    $this->set(compact('lat', 'lng', 'msg'));
    $this->render('/Elements/sse');


}

视图 Elements/sse 已针对服务器发送的事件正确配置

<?php
echo "data: {\n";
echo "data: \"lat\": \"$lat\",\n";
echo "data: \"lng\": \"$lng\",\n";
echo "data: \"country\": \"$msg\"\n";
echo "data: }\n\n";
flush();

如何将数据呈现到服务器发送事件将侦听的同一页面?

首先,您的 Listener 和 raiser 需要附加到某个地方,而不是在您要从 Listener 调用的控制器方法中。也许你已经这样做了,但是在你的 bootstrap.php 文件中你应该有这样的东西:

// Load event listeners
App::uses('TradeData', 'Lib/Event');
App::uses('CakeEventManager', 'Event');

// Attach listeners.
CakeEventManager::instance()->attach(new TradeData());

然后,在 TradeData Listener 中,您可以在 fireThis() 函数中调用控制器(主题)方法:

$event->subject->test_listener($event->data);

此外,您可以简化传递给 CakeEvent 的数据,使其看起来像这样:

$event = new CakeEvent('Data.post.received', $this, $data);