An application component is a confortable way for share information among all component of the application
In Yii there are many application components, for example Yii::app()->db.
Let's imagine we need almost everywhere an instance of the class Region, and we want to avoid to do too much queries.
We can create a class which extends CApplicationComponent, like that:
class RegionSingleton extends CApplicationComponent { private $_model=null; public function setModel($id) { $this->_model=Region::model()->findByPk($id); } public function getModel() { if (!$this->_model) { if (isset($_GET['region'])) $this->_model=Region::model()->findByAttributes(array('url_name'=> $_GET['region'])); else $this->_model=Region::model()->find(); } return $this->_model; } public function getId() { return $this->model->id; } public function getName() { return $this->model->name; } }
And include this class in config main:
'components'=>array( 'region'=>array('class'=>'RegionSingleton'), ... )
Now, wherever in the application we can call
Yii::app()->region->model
for have the model, or also
Yii::app()->region->id
for retrive the id.
We can also set the model by using
Yii::app()->region->setModel($id)
This approach can be very useful and resource-saving, because we do at most only a single query.
Total 4 comments
Since there can be only one instance of an application component per CWebApplication, it acts like a singleton, even if not stored in a static property.
I don't believe this is the Registry pattern either. To my knowledge a Registry pattern is form of singleton that controls storage of values inside it. A value can be set but not unset. See the Zend_Registry component as a reference.
A singleton will have a protected or private constructor with a static method that will return a single instance of the object. This is limits to one object being created hence the name 'Singleton'.
It is not singleton. This pattern name is Registry, using for dependency injection in your application.
Leave a comment
Please login to leave your comment.