You are viewing revision #2 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.
Singleton ¶
Singleton is a desing pattern that is very useful when exactly one object is needed to coordinate actions across the system.
In Yii there are many implementation of this pattern, for example Yii::app()->db.
In this article we will learn how to create a singleton.
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 CApplicationCompoment, 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, but is better to avoid to as it introduces global state into an application, and that can lead to bad practices.
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.