You are viewing revision #3 of this wiki article.
This is the latest version of this article.
You may want to see the changes made in this revision.
Application component ¶
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.
Creating the class ¶
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:
<?php
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'),
...
)
Usage ¶
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)
Conclusion ¶
This approach can be very useful and resource-saving, because we do at most only a single query.
It is not singleton
It is not singleton. This pattern name is Registry, using for dependency injection in your application.
Incorrect pattern
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'.
Not Registry either
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.
De Facto Singleton
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.
Registry pattern
As far as i know Registry Pattern is much like a key/value storage. Much like an object library. It can be used to retrieve same instance of an object as well as create and remove other instances. And it has global scope. So in a way it overcomes the single instance limitation of Singleton, as it allows us to have multiple instances available at any point of time.
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.