nineinchnick / yii-nfy
用于结束通知并使用Web通知和Ajax轮询显示通知的Yii框架模块。
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-14 13:15:33 UTC
README
这是一个为Yii框架提供的模块,它提供了
- 一个通用的队列组件
- 发布/订阅消息传递模式
- 一个SQL数据库队列实现
- 一种可配置的方式来发送各种通知、消息和任务到队列
- 一个基本的控件,用于从队列读取项目并将其作为系统通知显示给用户
- 一个基本的控件,可以放入导航栏中,显示弹出通知和/或消息
- 一个基本的CRUD来管理、调试队列或用作简单的消息传递工具
消息可以直接作为字符串传递,也可以从某些对象(如Active Records)创建。这可以用于记录模型的所有更改,就像audittrail2扩展一样。
当收件人订阅了一个频道时,消息传递可以依赖于类别过滤,这与框架提供的日志系统类似。
如果没有MQ服务器或不需要MQ服务器,提供了一个简单的SQL队列实现。
安装
下载并解压缩。
在配置中启用模块。在主配置和命令行配置中都要做,因为一些设置在迁移中使用。有关如何指定用户表名及其主键类型的配置部分,请参阅。
将迁移复制到您的迁移文件夹,并调整文件和类名称中的日期。然后应用迁移
./yiic migrate
定义一些队列作为应用程序组件,并可选地启用模块,请参阅下一节。
配置
队列组件
将每个队列定义为应用程序组件。
'components' => array( 'queue' => array( 'class' => 'nfy.components.NfyDbQueue', 'name' => 'Notifications', 'timeout' => 30, ), // ... ),
然后您可以通过此组件发送和接收消息
// send one message 'test' Yii::app()->queue->send('test'); // receive all available messages without using subscriptions and immediately delete them from the queue $messages = $queue->receive();
或者您可以将一些用户订阅到它
Yii::app()->queue->subscribe(Yii:app()->user->getId()); // send one message 'test' Yii::app()->queue->send('test'); // receive all available messages for current user and immediately delete them from the queue $messages = $queue->receive(Yii:app()->user->getId()); // if there are any other users subscribed, they will receive the message independently
模块参数
通过在userClass属性中指定用户模型类名,将使用正确的表名和主键列名在迁移中使用。
使用示例
广播
要向每个用户发送消息,创建一个队列并将每个用户订阅到它。
过滤
在将用户订阅到队列时,可以指定一个类别列表。只有与匹配的类别相关的消息才会发送到这个订阅。这个系统模仿了框架中的记录器。
通知模型更改
监视一个模型的更改并通知一些用户。
通过扩展NfyDbQueue或NfyQueue类,可以处理非字符串消息,并从这些数据创建字符串消息体。
// this could be your CActiveRecord model class Test extends CActiveRecord { ... // CActiveRecord requires some methods, this is skipped for keeping this short public static function match($data) { return $data['new']->attribute == 'value'; } public function afterFind($event){ $this->_old($this->getOwner()->getAttributes()); return parent::afterFind($event); } public function afterSave($event) { $old = clone $this; $old->setAttributes($this->_old); Yii::app()->queue->send(array('old'=>$old,'new'=>$this), 'logs.audit'); return parent::afterSave($event); } } // trigger logging $test = Test::model()->find(); $test->attribute = 'value'; $test->save();
显示通知
可以在布局、视图或控制器中的任何位置放置。
$this->widget('nfy.extensions.webNotifications.WebNotifications', array('url'=>$this->createUrl('/nfy/default/poll', array('id'=>'queueComponentId'))));
与Pusher一起使用
而不是使用NfyQueue,可以使用pusher扩展将消息直接发布到Pusher.com服务。
$pusher = Yii::createComponent(array( 'class' => 'Pusher', 'key' => 'XXX', 'secret' => 'YYY', 'appId' => 'ZZZ', )); $pusher->trigger('test_channel','newMessage',array('title'=>'nfy title', 'body'=>'test message'));
配置WebNotifications小部件以通过WebSocket接收消息
<?php $this->widget('nfy.extensions.webNotifications.WebNotifications', array( 'url'=>'ws://ws.pusherapp.com:80/app/XXXclient=javascript&protocol=6', 'method'=>WebNotifications::METHOD_PUSH, 'websocket'=>array( 'onopen'=>'js:function(socket){return function(e) { socket.send(JSON.stringify({ "event": "pusher:subscribe", "data": {"channel": "test_channel"} })); };}', 'onmessage'=>'js:function(_socket){return function(e) { var message = JSON.parse(e.data); var data = JSON.parse(message.data); if (typeof data.title != "undefined" && typeof data.body != "undefined") { notificationsPoller.addMessage(data); notificationsPoller.display(); } };}', ), )); ?>
缺点是当页面刷新时,它暂时与Pusher断开连接。因此,如果您在处理仅打开的页面实例的请求时发送任何消息,则不会收到任何消息。
示例主要说明了如何使用WebSocket和不同于Nfy::log()的不同的交付方法。
接收消息
通过配置WebNotifications小部件,可以通过以下方式读取消息
- 使用ajax轮询(在固定时间间隔重复请求)一个操作,该操作检查队列并返回新项目
- 连接到WebSocket并等待新项目
变更日志
0.9 - 2013-12-28
警告! 本版本破坏了向下兼容性。必须删除所有数据库表并重新运行迁移。
- 对提供通用队列组件的接口进行了重大重构,提高了接口质量。
- 重写了消息过滤和订阅投递。
- 支持超时保留消息。
- 基本的CRUD操作,用于管理/调试队列或作为简单的消息接口。
0.6.5 - 2013-08-20
- 修复了默认控制器中的一个拼写错误。
- 在WebNotifications小部件中添加了对WebSocket的支持。
- 更多示例和更新文档。
0.6 - 2013-08-15
- 启用了长轮询。
- 对SQLite的迁移进行了修复。
0.5.5 - 2013-08-12
- 在NfyChannels::subscribe()方法中指定传输。
- 保存NfySubscriptions模型时填充registered_on的值。
0.5 - 2013-07-16
破坏向后兼容性
- 添加了路由和默认的NfyDbRoute实现,这需要重构数据库模式,因此记住在升级时应用迁移。已删除'criteria_callback'列,并由NfyDbRoute类的'canSend()'方法替换。
其他更改
- 保存发送用户ID,以便用于过滤接收者和定制消息正文。
- 将userClass参数添加到模块中,以提取用户表名及其主键列名和类型。
- 更新了文档。
0.3 - 2013-07-13
- 首次发布