最好的办法是,在应用程序生命周期内,对于数据库设置有事件钩子,用于监听程序对于数据库的 *** 作。这样非常方便处理逻辑流程。
1 - 表的数据变化
表数据发生了变化,毫无疑问是写 *** 作,包括以下几种情形:
新建条目 create
更新条目 update
删除条目 delete
以上三种都是写 *** 作,会对表数据写入。
2 - 事件钩子
既然需要实时监控,那么每个数据库的 *** 作,都需要考虑在内,这是全局的监听。
以laravel的Eloquent ORM 模型触发事件,允许你挂接到模型生命周期的如下节点: retrieved、creating、created、updating、updated、saving、saved、deleting、deleted、restoring 和 restored。事件允许你每当特定模型保存或更新数据库时执行代码。每个事件通过其构造器接受模型实例。
模型内添加事件监听钩子
如果重用率很高,那么使用观察者 Observer 方式进行监听更为高效。
Laravel Observer
结语上面的方法要求读者有laravel框架的使用基础,对于构建中大型应用非常有利。
如何实现事件监听,参考了jQuery的事件绑定思路,简单的实现了一下。主要功能:
1.绑定事件 支持一个事件绑定多个动作,支持绑定一次性事件
2.触发事件
3.注销事件
复制代码 代码如下:
class Event
{
protected static $listens = array()
public static function listen($event, $callback, $once=false){
if(!is_callable($callback)) return false
self::$listens[$event][]= array('callback'=>$callback, 'once'=>$once)
return true
}
public static function one($event, $callback){
return self::listen($event, $callback, true)
}
public static function remove($event, $index=null){
if(is_null($index))
unset(self::$listens[$event])
else
unset(self::$listens[$event][$index])
}
public static function trigger(){
if(!func_num_args()) return
$args = func_get_args()
$event = array_shift($args)
if(!isset(self::$listens[$event])) return false
foreach((array) self::$listens[$event] as $index=>$listen){
$callback = $listen['callback']
$listen['once'] &&self::remove($event, $index)
call_user_func_array($callback, $args)
}
}
}
以下是一些调用的例子:
复制代码 代码如下:
// 增加监听walk事件
Event::listen('walk', function(){
echo "I am walking...n"
})
// 增加监听walk一次性事件
Event::listen('walk', function(){
echo "I am listening...n"
}, true)
// 触发walk事件
Event::trigger('walk')
/*
I am walking...
I am listening...
*/
Event::trigger('walk')
/*
I am walking...
*/
Event::one('say', function($name=''){
echo "I am {$name}n"
})
Event::trigger('say', 'deeka')// 输出 I am deeka
Event::trigger('say', 'deeka')// not run
class Foo
{
public function bar(){
echo "Foo::bar() is calledn"
}
public function test(){
echo "Foo::foo() is called, agrs:".json_encode(func_get_args())."n"
}
}
$foo= new Foo
Event::listen('bar', array($foo, 'bar'))
Event::trigger('bar')
Event::listen('test', array($foo, 'test'))
Event::trigger('test', 1, 2, 3)
class Bar
{
public static function foo(){
echo "Bar::foo() is calledn"
}
}
Event::listen('bar1', array('Bar', 'foo'))
Event::trigger('bar1')
Event::listen('bar2', 'Bar::foo')
Event::trigger('bar2')
function bar(){
echo "bar() is calledn"
}
Event::listen('bar3', 'bar')
Event::trigger('bar3')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)