/** * 通过传入的对象配置数组,创建一个 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)); } }
/** * @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; }