/** * 在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 . '();'); } }