Note: Support for module has been available since version 1.0.3.
A module is a self-contained software unit that consists of models, views, controllers and other supporting components. In many aspects, a module resembles to an application. The main difference is that a module cannot be deployed alone and it must reside inside of an application. Users can access the controllers in a module like they do with normal application controllers.
Modules are useful in several scenarios. For a large-scale application, we may divide it into several modules, each being developed and maintained separately. Some commonly used features, such as user management, comment management, may be developed in terms of modules so that they can be reused easily in future projects.
A module is organized as a directory whose name serves as its unique ID. The structure of the module directory is similar to that of the application base directory. The following shows the typical directory structure of a module named
forum/ ForumModule.php the module class file components/ containing reusable user components views/ containing view files for widgets controllers/ containing controller class files DefaultController.php the default controller class file extensions/ containing third-party extensions models/ containing model class files views/ containing controller view and layout files layouts/ containing layout view files default/ containing view files for DefaultController index.php the index view file
A module must have a module class that extends from CWebModule. The class name is determined using the expression
$id refers to the module ID (or the module directory name). The module class serves as the central place for storing information shared among the module code. For example, we can use CWebModule::params to store module parameters, and use CWebModule::components to share application components at the module level.
Tip: We can use the
yiictool to create the basic skeleton of a new module. For example, to create the above
forummodule, we can execute the following commands in a command line window:% cd WebRoot/testdrive % protected/yiic shell Yii Interactive Tool v1.0 Please type 'help' for help. Type 'exit' to quit. >> module forum
To use a module, first place the module directory under
modules of the application base directory. Then declare the module ID in the modules property of the application. For example, in order to use the above
forum module, we can use the following application configuration:
return array( ...... 'modules'=>array('forum',...), ...... );
A module can also be configured with initial property values. The usage is very similar to configuring application components. For example, the
forum module may have a property named
postPerPage in its module class which can be configured in the application configuration as follows:
return array( ...... 'modules'=>array( 'forum'=>array( 'postPerPage'=>20, ), ), ...... );
The module instance may be accessed via the module property of the currently active controller. Through the module instance, we can then access information that are shared at the module level. For example, in order to access the above
postPerPage information, we can use the following expression:
$postPerPage=Yii::app()->controller->module->postPerPage; // or the following if $this refers to the controller instance // $postPerPage=$this->module->postPerPage;
A controller action in a module can be accessed using the route
moduleID/controllerID/actionID. For example, assuming the above
forum module has a controller named
PostController, we can use the route
forum/post/create to refer to the
create action in this controller. The corresponding URL for this route would be
Tip: If a controller is in a sub-directory of
controllers, we can still use the above route format. For example, assuming
forum/controllers/admin, we can refer to the
Modules can be nested. That is, a module can contain another module. We call the former parent module while the latter child module. Child modules must be placed under the
modules directory of the parent module. To access a controller action in a child module, we should use the route