Esempio n. 1
0
 /**
  * 载入缓存的 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'];
 }
Esempio n. 2
0
 /**
  * 检查指定角色是否有权限访问特定的控制器和动作
  *
  * @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);
 }
Esempio n. 3
0
 /**
  * 将 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";
 }
Esempio n. 4
0
 /**
  * 追加日志到日志缓存
  *
  * @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);
 }
Esempio n. 5
0
 /**
  * 创建书籍记录
  *
  * @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;
 }
Esempio n. 6
0
 function testSingleton()
 {
     $obj1 = Q::singleton('Class2');
     $obj2 = Q::singleton('Class2');
     $this->assertSame($obj1, $obj2);
 }