You are viewing revision #3 of this wiki article.
This version may not be up to date with the latest version.
You may want to view the differences to the latest version or see the changes made in this revision.
The Yii documentation states:
An application module may be considered as a self-contained sub-application that has its own controllers, models and views and can be reused in a different project as a whole. Controllers inside a module must be accessed with routes that are prefixed with the module ID.
So, in practice, a module can be handled like an application, but with minor differences.
Suppose you had a custom component 'foo' in your application:
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'preload'=>array('log'),
'import'=>array(
'application.models.*',
'application.components.*'
),
'components'=>array(
'db'=>array(
),
//right down here:
'foo' => array(
'param1' => 'val1'
)
),
...and you need to move it inside a module called 'bar':
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'preload'=>array('log'),
'import'=>array(
'application.models.*',
'application.components.*'
),
'components'=>array(
'db'=>array(
)
),
'modules' => array(
'bar' => array(
'components' => array(
'foo' => array(
'param1' => 'val1'
)
)
)
)
//...
Now instead of using the component:
Yii::app()->foo
You call it from within the module:
Yii::app()->controller->module->foo
As you can see, your module is indeed just another application, and you can configure any parameters as you'd do with your "root" application. The only organizational differences are:
- a module has a module "entry point", the FooModule which extends CWebModule. Whereas the root application is bootstrapped by the framework itself, starting with your entry script (index.php)
- the application's SiteController is called inside a module DefaultController
An alternative (better) way to call
Use Yii::app()->getModule('bar')->foo to access 'foo' components, so that you can do it across the whole project while Yii::app()->controller->module->foo only works if it's in 'bar' module.
Thanks
Saved a lot of time, mate :)
syntax
In your example:
Yii::app()->getModule('module')->foo
Must be:
Yii::app()->getModule('bar')->foo
Thank you for explaining how this goes in Yii!
How do i use it for the entire controller
Yii::app()->getModule('user');
i want to use this in all actions in siteController, there are 100 actions in that. instead of using this line(Yii::app()->getModule('admin');) in all actions how can i use it common for all actions in the controller.
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.