/** * 载入缓存的 YAML 解析结果,如果缓存失效,则重新解析并生成缓存 * * 用法: * @code php * $arr = Helper_YAML::loadCached($filename); * @endcode * * $replace 参数的用法参考 load() 方法。 * * @param string $filename 要解析的 yaml 文件名 * @param array $replace 对于 YAML 内容要进行自动替换的字符串对 * @param string $cache_backend 要使用的缓存后端 * * @return array 解析结果 * @throw Q_FileNotFoundException */ static function loadCached($filename, array $replace = null, $cache_backend = null) { static $cache_obj = null; if (!is_file($filename)) { throw new Q_FileNotFoundException($filename); } $policy = array('lifetime' => 86400, 'serialize' => true); $mtime = filemtime($filename); $id = 'yaml_cache_' . md5($filename); if (is_null($cache_backend)) { if (is_null($cache_obj)) { $cache_obj = Q::singleton(Q::ini('runtime_cache_backend')); } $cache = $cache_obj; } else { $cache = Q::singleton($cache_backend); } /* @var $cache QCache_File */ $data = $cache->get($id, $policy); if (!isset($data['yaml']) || empty($data['mtime']) || $data['mtime'] < $mtime) { // 缓存失效 $data = array('mtime' => $mtime, 'yaml' => self::load($filename, $replace)); $cache->set($id, $data, $policy); } return $data['yaml']; }
/** * 检查指定角色是否有权限访问特定的控制器和动作 * * @param array $roles * @param string|array $udi * * @return boolean */ function authorizedUDI($roles, $udi) { /** * 将 UDI 封装为一个资源 * 读取控制器的 ACL(访问控制列表) * 通过 QACL 组件进行权限检查 */ $roles = Q::normalize($roles); $udi = QContext::instance()->normalizeUDI($udi); $controller_acl = $this->controllerACL($udi); // 首先检查动作 ACT $acl = Q::singleton('QACL'); $action_name = strtolower($udi[QContext::UDI_ACTION]); if (isset($controller_acl['actions'][$action_name])) { // 如果动作的 ACT 检验通过,则忽略控制器的 ACT return $acl->rolesBasedCheck($roles, $controller_acl['actions'][$action_name]); } if (isset($controller_acl['actions'][QACL::ALL_ACTIONS])) { // 如果为所有动作指定了默认 ACT,则使用该 ACT 进行检查 return $acl->rolesBasedCheck($roles, $controller_acl['actions'][QACL::ALL_ACTIONS]); } // 否则检查是否可以访问指定控制器 return $acl->rolesBasedCheck($roles, $controller_acl); }
/** * 将 PHP 数组(或者实现了 ArrayAccess 接口的对象)输出为字符串 * * @param array $data 要输出的数组 * @param int $indent 缩进空格数 * * @return string 输出结果 */ static function dump($data, $indent = 2) { $dumper = Q::singleton('sfYamlDumper'); return "# <?php die(); ?>\n\n" . $dumper->dump($data, 1) . "\n"; }
/** * 追加日志到日志缓存 * * @param string $msg * @param int $type */ static function log($msg, $type = self::DEBUG) { static $instance; if (is_null($instance)) { $instance = Q::singleton('QLog'); } /* @var $instance QLog */ $instance->append($msg, $type); }
/** * 创建书籍记录 * * @param array $authors * @param int $nums * * @return array */ protected function insertBooks(array $authors, $nums = 10) { $tableBooks = Q::singleton('Table_Books'); /* @var $tableBooks Table_Books */ $authors = array_values($authors); $authors_count = count($authors); $books = array(); for ($i = 0; $i < $nums; $i++) { $c = mt_rand(1, $authors_count); $rand_authors = array(); for ($j = 0; $j < $c; $j++) { $rand_authors[] = $authors[mt_rand(0, $j * $j) % $authors_count]; } $book = array('title' => 'BOOK ' . mt_rand(), 'intro' => 'INTRO ' . mt_rand(), 'authors' => $rand_authors); $books[] = $tableBooks->create($book); } return $books; }
function testSingleton() { $obj1 = Q::singleton('Class2'); $obj2 = Q::singleton('Class2'); $this->assertSame($obj1, $obj2); }