包 | system.base |
---|---|
继承 | abstract class CModule » CComponent |
子类 | CApplication, CWebModule |
版本 | $Id: CModule.php 3515 2011-12-28 12:29:24Z mdomba $ |
源码 |
CModule主要管理应用组件和子模块。
公共属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
basePath | string | 返回模块根目录。 | CModule |
behaviors | array | the behaviors that should be attached to the module. | CModule |
components | array | 返回应用组件。 | CModule |
id | string | 返回模块ID。 | CModule |
modulePath | string | 返回包含应用程序模块的目录。 | CModule |
modules | array | 返回应用程序当前已经安装的模块。 | CModule |
params | CAttributeCollection | 返回用户定义的参数。 | CModule |
parentModule | CModule | 返回父模块。 | CModule |
preload | array | the IDs of the application components that should be preloaded. | CModule |
公共方法
方法 | 描述 | 定义在 |
---|---|---|
__call() | 如果类中没有调的方法名,则调用这个方法。 | CComponent |
__construct() | 构造方法。 | CModule |
__get() | getter魔术方法。 | CModule |
__isset() | 检查一个属性值是否为null。 | CModule |
__set() | 设置一个组件的属性值。 | CComponent |
__unset() | 设置一个组件的属性为null。 | CComponent |
asa() | 返回这个名字的行为对象。 | CComponent |
attachBehavior() | 附加一个行为到组件。 | CComponent |
attachBehaviors() | 附加一个行为列表到组件。 | CComponent |
attachEventHandler() | 为事件附加一个事件处理程序。 | CComponent |
canGetProperty() | 确定属性是否可读。 | CComponent |
canSetProperty() | 确定属性是否可写。 | CComponent |
configure() | 为模块指定配置。 | CModule |
detachBehavior() | 从组件中分离一个行为。 | CComponent |
detachBehaviors() | 从组件中分离所有行为。 | CComponent |
detachEventHandler() | 分离一个存在的事件处理程序。 | CComponent |
disableBehavior() | 禁用一个附加行为。 | CComponent |
disableBehaviors() | 禁用组件附加的所有行为。 | CComponent |
enableBehavior() | 启用一个附加行为。 | CComponent |
enableBehaviors() | 启用组件附加的所有行为。 | CComponent |
evaluateExpression() | 计算一个PHP表达式,或根据组件上下文执行回调。 | CComponent |
getBasePath() | 返回模块根目录。 | CModule |
getComponent() | Retrieves the named application component. | CModule |
getComponents() | 返回应用组件。 | CModule |
getEventHandlers() | 返回一个事件的附加处理程序列表。 | CComponent |
getId() | 返回模块ID。 | CModule |
getModule() | 检索指定的应用模块。 | CModule |
getModulePath() | 返回包含应用程序模块的目录。 | CModule |
getModules() | 返回应用程序当前已经安装的模块。 | CModule |
getParams() | 返回用户定义的参数。 | CModule |
getParentModule() | 返回父模块。 | CModule |
hasComponent() | 检查是否存在指定组件。 | CModule |
hasEvent() | 确定一个事件是否定义。 | CComponent |
hasEventHandler() | 检查事件是否有附加的处理程序。 | CComponent |
hasModule() | 检查是否已经安装了指定模块。 | CModule |
hasProperty() | 确定属性是否被定义。 | CComponent |
raiseEvent() | 发起一个事件。 | CComponent |
setAliases() | 定义根目录的别名。 | CModule |
setBasePath() | 设置块根目录。 | CModule |
setComponent() | 添加一个组件到模块中 | CModule |
setComponents() | 设置应用组件。 | CModule |
setId() | 设置模块ID。 | CModule |
setImport() | 设置在模块中使用的路径别名。 | CModule |
setModulePath() | 设置包含应用程序模块的目录。 | CModule |
setModules() | 配置模块的子模块。 | CModule |
setParams() | 设置用户定义的参数。 | CModule |
受保护方法
方法 | 描述 | 定义在 |
---|---|---|
init() | 初始化模块。 | CModule |
preinit() | 模块预初始化。 | CModule |
preloadComponents() | 加载静态应用组件。 | CModule |
属性详细
返回模块根目录。
the behaviors that should be attached to the module. The behaviors will be attached to the module when init is called. Please refer to CModel::behaviors on how to specify the value of this property.
public void setComponents(array $components, boolean $merge=true)
返回应用组件。
返回模块ID。
返回包含应用程序模块的目录。
返回应用程序当前已经安装的模块。
返回用户定义的参数。
返回父模块。
the IDs of the application components that should be preloaded.
方法详细
public void __construct(string $id, CModule $parent, mixed $config=NULL)
| ||
$id | string | the ID of this module |
$parent | CModule | the parent module (if any) |
$config | mixed | the module configuration. It can be either an array or the path of a PHP file returning the configuration array. |
public function __construct($id,$parent,$config=null)
{
$this->_id=$id;
$this->_parentModule=$parent;
// set basePath at early as possible to avoid trouble
if(is_string($config))
$config=require($config);
if(isset($config['basePath']))
{
$this->setBasePath($config['basePath']);
unset($config['basePath']);
}
Yii::setPathOfAlias($id,$this->getBasePath());
$this->preinit();
$this->configure($config);
$this->attachBehaviors($this->behaviors);
$this->preloadComponents();
$this->init();
}
构造方法。
public mixed __get(string $name)
| ||
$name | string | application component or property name |
{return} | mixed | the named property value |
public function __get($name)
{
if($this->hasComponent($name))
return $this->getComponent($name);
else
return parent::__get($name);
}
getter魔术方法。 This method is overridden to support accessing application components like reading module properties.
public boolean __isset(string $name)
| ||
$name | string | the property name or the event name |
{return} | boolean | whether the property value is null |
public function __isset($name)
{
if($this->hasComponent($name))
return $this->getComponent($name)!==null;
else
return parent::__isset($name);
}
检查一个属性值是否为null。 This method overrides the parent implementation by checking if the named application component is loaded.
public void configure(array $config)
| ||
$config | array | the configuration array |
public function configure($config)
{
if(is_array($config))
{
foreach($config as $key=>$value)
$this->$key=$value;
}
}
为模块指定配置。
public string getBasePath()
| ||
{return} | string | the root directory of the module. Defaults to the directory containing the module class. |
public function getBasePath()
{
if($this->_basePath===null)
{
$class=new ReflectionClass(get_class($this));
$this->_basePath=dirname($class->getFileName());
}
return $this->_basePath;
}
返回模块根目录。
public IApplicationComponent getComponent(string $id, boolean $createIfNull=true)
| ||
$id | string | application component ID (case-sensitive) |
$createIfNull | boolean | whether to create the component if it doesn't exist yet. |
{return} | IApplicationComponent | the application component instance, null if the application component is disabled or does not exist. |
public function getComponent($id,$createIfNull=true)
{
if(isset($this->_components[$id]))
return $this->_components[$id];
else if(isset($this->_componentConfig[$id]) && $createIfNull)
{
$config=$this->_componentConfig[$id];
if(!isset($config['enabled']) || $config['enabled'])
{
Yii::trace("Loading \"$id\" application component",'system.CModule');
unset($config['enabled']);
$component=Yii::createComponent($config);
$component->init();
return $this->_components[$id]=$component;
}
}
}
Retrieves the named application component.
参见
public array getComponents(boolean $loadedOnly=true)
| ||
$loadedOnly | boolean | whether to return the loaded components only. If this is set false, then all components specified in the configuration will be returned, whether they are loaded or not. Loaded components will be returned as objects, while unloaded components as configuration arrays. This parameter has been available since version 1.1.3. |
{return} | array | the application components (indexed by their IDs) |
public function getComponents($loadedOnly=true)
{
if($loadedOnly)
return $this->_components;
else
return array_merge($this->_componentConfig, $this->_components);
}
返回应用组件。
public string getId()
| ||
{return} | string | the module ID. |
public function getId()
{
return $this->_id;
}
返回模块ID。
public CModule getModule(string $id)
| ||
$id | string | application module ID (case-sensitive) |
{return} | CModule | the module instance, null if the module is disabled or does not exist. |
public function getModule($id)
{
if(isset($this->_modules[$id]) || array_key_exists($id,$this->_modules))
return $this->_modules[$id];
else if(isset($this->_moduleConfig[$id]))
{
$config=$this->_moduleConfig[$id];
if(!isset($config['enabled']) || $config['enabled'])
{
Yii::trace("Loading \"$id\" module",'system.base.CModule');
$class=$config['class'];
unset($config['class'], $config['enabled']);
if($this===Yii::app())
$module=Yii::createComponent($class,$id,null,$config);
else
$module=Yii::createComponent($class,$this->getId().'/'.$id,$this,$config);
return $this->_modules[$id]=$module;
}
}
}
检索指定的应用模块。 The module has to be declared in modules. A new instance will be created when calling this method with the given ID for the first time.
public string getModulePath()
| ||
{return} | string | the directory that contains the application modules. Defaults to the 'modules' subdirectory of basePath. |
public function getModulePath()
{
if($this->_modulePath!==null)
return $this->_modulePath;
else
return $this->_modulePath=$this->getBasePath().DIRECTORY_SEPARATOR.'modules';
}
返回包含应用程序模块的目录。
public array getModules()
| ||
{return} | array | the configuration of the currently installed modules (module ID => configuration) |
public function getModules()
{
return $this->_moduleConfig;
}
返回应用程序当前已经安装的模块。
public CAttributeCollection getParams()
| ||
{return} | CAttributeCollection | the list of user-defined parameters |
public function getParams()
{
if($this->_params!==null)
return $this->_params;
else
{
$this->_params=new CAttributeCollection;
$this->_params->caseSensitive=true;
return $this->_params;
}
}
返回用户定义的参数。
public CModule getParentModule()
| ||
{return} | CModule | the parent module. Null if this module does not have a parent. |
public function getParentModule()
{
return $this->_parentModule;
}
返回父模块。
public boolean hasComponent(string $id)
| ||
$id | string | application component ID |
{return} | boolean | whether the named application component exists (including both loaded and disabled.) |
public function hasComponent($id)
{
return isset($this->_components[$id]) || isset($this->_componentConfig[$id]);
}
检查是否存在指定组件。
public boolean hasModule(string $id)
| ||
$id | string | the module ID |
{return} | boolean | whether the specified module is installed. |
public function hasModule($id)
{
return isset($this->_moduleConfig[$id]) || isset($this->_modules[$id]);
}
检查是否已经安装了指定模块。
protected void init()
|
protected function init()
{
}
初始化模块。 This method is called at the end of the module constructor. Note that at this moment, the module has been configured, the behaviors have been attached and the application components have been registered.
参见
protected void preinit()
|
protected function preinit()
{
}
模块预初始化。 This method is called at the beginning of the module constructor. You may override this method to do some customized preinitialization work. Note that at this moment, the module is not configured yet.
参见
protected void preloadComponents()
|
protected function preloadComponents()
{
foreach($this->preload as $id)
$this->getComponent($id);
}
加载静态应用组件。
public void setAliases(array $mappings)
| ||
$mappings | array | list of aliases to be defined. The array keys are root aliases,
while the array values are paths or aliases corresponding to the root aliases.
For example,
array( 'models'=>'application.models', // an existing alias 'extensions'=>'application.extensions', // an existing alias 'backend'=>dirname(__FILE__).'/../backend', // a directory ) |
public function setAliases($mappings)
{
foreach($mappings as $name=>$alias)
{
if(($path=Yii::getPathOfAlias($alias))!==false)
Yii::setPathOfAlias($name,$path);
else
Yii::setPathOfAlias($name,$alias);
}
}
定义根目录的别名。
public void setBasePath(string $path)
| ||
$path | string | the root directory of the module. |
public function setBasePath($path)
{
if(($this->_basePath=realpath($path))===false || !is_dir($this->_basePath))
throw new CException(Yii::t('yii','Base path "{path}" is not a valid directory.',
array('{path}'=>$path)));
}
设置块根目录。 This method can only be invoked at the beginning of the constructor.
public void setComponent(string $id, IApplicationComponent $component)
| ||
$id | string | component ID |
$component | IApplicationComponent | the component to be added to the module. If this parameter is null, it will unload the component from the module. |
public function setComponent($id,$component)
{
if($component===null)
unset($this->_components[$id]);
else
{
$this->_components[$id]=$component;
if(!$component->getIsInitialized())
$component->init();
}
}
添加一个组件到模块中 The component will be initialized by calling its init() method if it has not done so.
public void setComponents(array $components, boolean $merge=true)
| ||
$components | array | application components(id=>component configuration or instances) |
$merge | boolean | whether to merge the new component configuration with the existing one. Defaults to true, meaning the previously registered component configuration of the same ID will be merged with the new configuration. If false, the existing configuration will be replaced completely. |
public function setComponents($components,$merge=true)
{
foreach($components as $id=>$component)
{
if($component instanceof IApplicationComponent)
$this->setComponent($id,$component);
else if(isset($this->_componentConfig[$id]) && $merge)
$this->_componentConfig[$id]=CMap::mergeArray($this->_componentConfig[$id],$component);
else
$this->_componentConfig[$id]=$component;
}
}
设置应用组件。
When a configuration is used to specify a component, it should consist of
the component's initial property values (name-value pairs). Additionally,
a component can be enabled (default) or disabled by specifying the 'enabled' value
in the configuration.
If a configuration is specified with an ID that is the same as an existing
component or configuration, the existing one will be replaced silently.
The following is the configuration for two components:
array( 'db'=>array( 'class'=>'CDbConnection', 'connectionString'=>'sqlite:path/to/file.db', ), 'cache'=>array( 'class'=>'CDbCache', 'connectionID'=>'db', 'enabled'=>!YII_DEBUG, // enable caching in non-debug mode ), )
public void setId(string $id)
| ||
$id | string | the module ID |
public function setId($id)
{
$this->_id=$id;
}
设置模块ID。
public void setImport(array $aliases)
| ||
$aliases | array | list of aliases to be imported |
public function setImport($aliases)
{
foreach($aliases as $alias)
Yii::import($alias);
}
设置在模块中使用的路径别名。
public void setModulePath(string $value)
| ||
$value | string | the directory that contains the application modules. |
public function setModulePath($value)
{
if(($this->_modulePath=realpath($value))===false || !is_dir($this->_modulePath))
throw new CException(Yii::t('yii','The module path "{path}" is not a valid directory.',
array('{path}'=>$value)));
}
设置包含应用程序模块的目录。
public void setModules(array $modules)
| ||
$modules | array | module configurations. |
public function setModules($modules)
{
foreach($modules as $id=>$module)
{
if(is_int($id))
{
$id=$module;
$module=array();
}
if(!isset($module['class']))
{
Yii::setPathOfAlias($id,$this->getModulePath().DIRECTORY_SEPARATOR.$id);
$module['class']=$id.'.'.ucfirst($id).'Module';
}
if(isset($this->_moduleConfig[$id]))
$this->_moduleConfig[$id]=CMap::mergeArray($this->_moduleConfig[$id],$module);
else
$this->_moduleConfig[$id]=$module;
}
}
配置模块的子模块。
Call this method to declare sub-modules and configure them with their initial property values.
The parameter should be an array of module configurations. Each array element represents a single module,
which can be either a string representing the module ID or an ID-configuration pair representing
a module with the specified ID and the initial property values.
For example, the following array declares two modules:
array( 'admin', // a single module ID 'payment'=>array( // ID-configuration pair 'server'=>'paymentserver.com', ), )
By default, the module class is determined using the expression
ucfirst($moduleID).'Module'
.
And the class file is located under modules/$moduleID
.
You may override this default by explicitly specifying the 'class' option in the configuration.
You may also enable or disable a module by specifying the 'enabled' option in the configuration.
public void setParams(array $value)
| ||
$value | array | user-defined parameters. This should be in name-value pairs. |
public function setParams($value)
{
$params=$this->getParams();
foreach($value as $k=>$v)
$params->add($k,$v);
}
设置用户定义的参数。