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);
我已经用事件系统配置了 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);