www.gusucode.com > iWebshop开源PHP商城系统 v2.8源码程序 > iwebshop/lib/core/interceptor_class.php
<?php /** * @copyright Copyright(c) 2011 jooyea.cn * @file interceptor_class.php * @brief 内核拦截器 * @author walu * @date 2011-07-15 * @version 0.1 */ /** * 内核拦截器 * * 在app中使用这个类,需要在config.php里配置interceptor * 'interceptor'=>array( * 'classname', //将classname类注册到所有位置 * 'classname1@onFinishApp', //将classname1类注册到onFinishApp这个位置 * ); * * <ul> * <li>onPhpShutDown一旦注册,便肯定会执行,即使程序中调用了die和exit</li> * </ul> * * 在使用拦截器时,建议一个拦截器只完成一方面的工作,比如IBlog@onFinishApp,IUser@onCreateApp * 虽然IBlog和IUser的逻辑可以写在一类里,但为了以后维护的方便,建议拆分开 * * @author walu */ class IInterceptor { /** * @brief 系统中预定的位置 */ private static $validPosition = array( 'onCreateApp', 'onFinishApp', 'onCreateController', 'onFinishController', 'onCreateAction', 'onFinishAction', 'onCreateView', 'onFinishView', 'onPhpShutDown' ); private static $obj = array(); /** * 向系统中的拦截位置注册类 * @param string|array $value 可以为 "iclass_name","class_name@position",也可以是由他们组成的数组 */ public static function reg($value) { if( is_array($value) ) { foreach($value as $v) { self::reg($v); } } else { $tmp = explode("@",trim($value)); if( count($tmp) == 2 ) { self::regIntoPosition($tmp[0] , $tmp[1]); } else { foreach(self::$validPosition as $value) { self::regIntoPosition($tmp[0] , $value); } } } } /** * 直接像某位置注册类 * @param string $className * @param string $position */ public static function regIntoPosition($className,$position) { $validPos = in_array( $position,self::$validPosition); $haveDone = isset(self::$obj[$position]) && in_array( $className,self::$obj[$position]); if( $validPos && !$haveDone ) { self::$obj[$position][] = $className; } } /** * 调用注册到某个位置的拦截器 * @param string $position 位置 * @param mixed $param 传递的参数 */ public static function run($position,$param = null) { if( !isset(self::$obj[$position]) || !in_array($position , self::$validPosition ) ) { return; } foreach( self::$obj[$position] as $value ) { call_user_func( array($value,$position),$param ); } } /** * 删除某个位置的所有拦截器,如果$className!=null,则只删除它一个 * @param string $position * @param string|null $className */ public static function del($position,$className = null) { if(!isset(self::$obj[$position])) { if($className!==null) { foreach(self::$obj[$position] as $key=>$value) { if( $className==$value ) { unset(self::$obj[$position][$key]); break; } } } else { unset(self::$obj[$position]); } } } /** * 清空所有拦截器 */ public static function delAll() { self::$obj = array(); } /** * 调用所有的onFinishApp拦截器 */ public static function shutDown() { self::run("onPhpShutDown"); } } /** * 拦截器基类,建议大家在创建拦截器对象的时候继承此类。 */ class IInterceptorBase { public static function onCreateApp(){} public static function onFinishApp(){} public static function onCreateController(){} public static function onFinishController(){} public static function onCreateAction(){} public static function onFinishAction(){} public static function onCreateView(){} public static function onFinishView(){} public static function onPhpShutDown(){} }