コード例 #1
0
ファイル: filter__.php プロジェクト: gxflying/OpenAI
 /**
  * 在XxxxAction模块或方法调用之前,执行绑定的过滤器(如果有)
  * 参数:Action名称,如'Test';方法名,如'test'.
  * 该方法仅供ActionUtil::invokeAction()、XxxxAction__call()、ActionUtil::__call()调用,以实现调用前先过滤的功能。
  */
 public static function doFilterIfHasIt($action, $method)
 {
     //获取XxxxAction通过实现Filter而绑定的所有过滤器方法
     $filters = get_class_methods($action . 'Action');
     if (!$filters) {
         return;
     }
     //第一步、执行内置过滤器方法(绑定在XxxxAction模块的默认过滤器),如果有
     if ($filters && in_array('doFilter', $filters)) {
         ActionUtil::action($action)->doFilter();
     }
     //获取XxxxAction通过定义XxxxFilter而绑定的所有过滤器方法
     $filters = get_class_methods($action . 'Filter');
     if (!$filters) {
         return;
     }
     //第二步、再执行绑定在Action模块的后续过滤器链,如果有
     $i = 0;
     while ($filters && ++$i <= count($filters) && in_array('doFilter_' . $i, $filters)) {
         eval('FilterUtil::filter($action)->doFilter_' . $i . '();');
     }
     //第三步、执行Action方法绑定的单过滤器(与方法名同名),如果有
     if (in_array($method, $filters)) {
         FilterUtil::filter($action)->{$method}();
     }
     //第四步、再执行绑定在Action方法的后续过滤器链,如果有
     $i = 0;
     while ($filters && ++$i <= count($filters) && in_array($method . '_' . $i, $filters)) {
         eval('FilterUtil::filter($action)->' . $method . '_' . $i . '();');
     }
 }