예제 #1
0
 /**
  * 通过传入的对象配置数组,创建一个 IBean 对象
  * @return org\jecat\framework\bean\IBean
  */
 public function createBean(array &$arrConfig, $sNamespace = '*', $bAutoBuild = true)
 {
     if ($sNamespace == '*' and !empty($arrConfig['namespace'])) {
         $sNamespace = $arrConfig['namespace'];
     }
     // ins
     if (!empty($arrConfig['ins']) or !empty($arrConfig['instance'])) {
         $sInstance = isset($arrConfig['ins']) ? $arrConfig['ins'] : $arrConfig['instance'];
         if (!($aFile = $this->beanFolders()->find($sInstance . '.ins.php', $sNamespace))) {
             throw new BeanConfException("Bean对象配置数组中的 ins 属性无效: %s,找不到指定的实例文件", $arrConfig['ins']);
         }
         return $aFile->includeFile(false, false);
     }
     $this->loadConfig($arrConfig, $sNamespace);
     if (!empty($arrConfig['class'])) {
         $arrConfig['class'] = $this->beanClassNameByAlias($arrConfig['class']) ?: $arrConfig['class'];
         if (!class_exists($arrConfig['class'])) {
             throw new BeanConfException("Bean对象配置数组中的 class 属性无效:%s,不存在该名称的类和别名", $arrConfig['class']);
         }
         if (!Type::hasImplements($arrConfig['class'], 'org\\jecat\\framework\\bean\\IBean')) {
             throw new BeanConfException("Bean对象配置数组中的 class 属性无效:%s,必须是一个实现 org\\jecat\\framework\\bean\\IBean 接口的类", $arrConfig['class']);
         }
         return $arrConfig['class']::createBean($arrConfig, $sNamespace, $bAutoBuild, $this);
     } else {
         throw new BeanConfException("无法根据配置数组创建 Bean 对象,缺少必须的 ins, config 或 class 属性: %s。", var_export($arrConfig, true));
     }
 }
예제 #2
0
 /**
  * @wiki /认证和授权/授权-许可(Authorizer)
  * ==Bean配置数组==
  * {|
  *  |perms
  *  |可选
  *  |array
  *  |perms属性数组的成员可以是字符串或数组:
  *  |如果是字符串,则表示 IPermission 类的类名(可以是在 BeanFeactory 中注册过的别名),该类必须实现 ISingleton 接口;
  *  如果是数组,则表示一个 IPermission 对象的 Bean 配置数组。
  *  perms属性数组的键名如果是字符串类型,可以做为对应元素Bean Config的class属性。
  *  |} 
  */
 public function buildBean(array &$arrConfig, $sNamespace = '*', BeanFactory $aBeanFactory = null)
 {
     if (!$aBeanFactory) {
         $aBeanFactory = BeanFactory::singleton();
     }
     if (!empty($arrConfig['perms'])) {
         if (!is_array($arrConfig['perms'])) {
             throw new BeanConfException('%s 类的Bean Config的属性 perms必须是数组格式,传入的格式是:%s', array(__CLASS__, Type::detectType($arrConfig['perms'])));
         }
         foreach ($arrConfig['perms'] as $key => &$config) {
             if (is_string($config)) {
                 $sClass = $aBeanFactory->beanClassNameByAlias($config);
                 if (!Type::hasImplements($sClass, 'org\\jecat\\framework\\pattern\\ISingletonable')) {
                     throw new BeanConfException('Bean 类 %s(%s) 没有实现 org\\jecat\\framework\\pattern\\ISingletonable 接口,无法只是通过类名创建对象', array($config, $sClass));
                 }
                 if (!Type::hasImplements($sClass, 'org\\jecat\\framework\\auth\\IPermission')) {
                     throw new BeanConfException('Bean 类 %s(%s) 没有实现 org\\jecat\\framework\\auth\\IPermission 接口,不能做为许可对象', array($config, $sClass));
                 }
                 $this->requirePermission($sClass::singleton());
             } else {
                 if (is_array($config)) {
                     if (is_string($key) and empty($config['class'])) {
                         $config['class'] = $key;
                     }
                     $aPermission = $aBeanFactory->createBean($config, $sNamespace, true);
                     if (!$aPermission instanceof IPermission) {
                         throw new BeanConfException('%s 的Bean配置中提供了无效的 Permission 配置:%s 不是一个实现 org\\jecat\\framework\\auth\\IPermission 接口的类', array(__CLASS__, $config['class']));
                     }
                     $this->requirePermission($aPermission);
                 }
             }
         }
     }
     $this->arrBeanConfig = $arrConfig;
 }