Cakephp和服务器端事件

时间:2015-04-13 21:46:57

标签: cakephp events

我已经使用事件系统配置了cakephp 2.6.3。 发布数据通过控制器方法进入并进行处理。然后,此数据将根据其documentation

传递到事件文件

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

在DataController中发布数据'Mocked'up事件以进行测试: - 我通过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
}

DataController类:: 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();

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

1 个答案:

答案 0 :(得分:1)

首先,您需要将监听器和提升器连接到除了您将从监听器调用的控制器方法之外的其他位置。也许你已经这样做了,但是在你的bootstrap.php文件中,你应该有类似的东西:

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

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

然后,在TradeData Listener中,您可以在fireThis()函数中调用controller(subject)方法:

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

此外,您可以简化传递给CakeEvent的数据,使其如下所示:

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