Commit 1b7c00a0 by Qiang Xue

...

parent 86ae5bdf
...@@ -76,16 +76,16 @@ class YiiBase ...@@ -76,16 +76,16 @@ class YiiBase
/** /**
* @var array initial property values that will be applied to objects newly created via [[createObject]]. * @var array initial property values that will be applied to objects newly created via [[createObject]].
* The array keys are fully qualified namespaced class names, and the array values are the corresponding * The array keys are fully qualified namespaced class names, and the array values are the corresponding
* name-value pairs for initializing the created class instances. Make sure the class names do NOT have * name-value pairs for initializing the created class instances. Please make sure class names are starting
* the leading backslashes. For example, * with a backslash. For example,
* *
* ~~~ * ~~~
* array( * array(
* 'mycompany\foo\Bar' => array( * '\Bar' => array(
* 'prop1' => 'value1', * 'prop1' => 'value1',
* 'prop2' => 'value2', * 'prop2' => 'value2',
* ), * ),
* 'mycompany\foo\Car' => array( * '\mycompany\foo\Car' => array(
* 'prop1' => 'value1', * 'prop1' => 'value1',
* 'prop2' => 'value2', * 'prop2' => 'value2',
* ), * ),
...@@ -301,6 +301,9 @@ class YiiBase ...@@ -301,6 +301,9 @@ class YiiBase
/** /**
* Creates a new object using the given configuration. * Creates a new object using the given configuration.
* *
* The class of the object can be any class. It does not have to
* extend from [[Object]] or [[Component]].
*
* The configuration can be either a string or an array. * The configuration can be either a string or an array.
* If a string, it is treated as the *object type*; if an array, * If a string, it is treated as the *object type*; if an array,
* it must contain a `class` element specifying the *object type*, and * it must contain a `class` element specifying the *object type*, and
...@@ -310,7 +313,7 @@ class YiiBase ...@@ -310,7 +313,7 @@ class YiiBase
* The object type can be either a class name or the [[getAlias|alias]] of * The object type can be either a class name or the [[getAlias|alias]] of
* the class. For example, * the class. For example,
* *
* - `\app\components\GoogleMap`: namespaced class * - `\app\components\GoogleMap`: full qualified namespaced class.
* - `@app/components/GoogleMap`: an alias * - `@app/components/GoogleMap`: an alias
* *
* This method does the following steps to create an object: * This method does the following steps to create an object:
...@@ -319,7 +322,7 @@ class YiiBase ...@@ -319,7 +322,7 @@ class YiiBase
* - if [[objectConfig]] contains the configuration for the object class, * - if [[objectConfig]] contains the configuration for the object class,
* it will be merged with the configuration passed to this method; * it will be merged with the configuration passed to this method;
* - initialize the object properties using the configuration passed to this method; * - initialize the object properties using the configuration passed to this method;
* - call the `init` method of the object if it implements the [[yii\base\Initable]] interface. * - call the `init` method of the object if it implements the [[\yii\base\Initable]] interface.
* *
* Below are some usage examples: * Below are some usage examples:
* *
...@@ -337,6 +340,7 @@ class YiiBase ...@@ -337,6 +340,7 @@ class YiiBase
* @param mixed $config the configuration. It can be either a string or an array. * @param mixed $config the configuration. It can be either a string or an array.
* @return mixed the created object * @return mixed the created object
* @throws \yii\base\Exception if the configuration is invalid. * @throws \yii\base\Exception if the configuration is invalid.
* @see \yii\base\Object::newInstance()
*/ */
public static function createObject($config) public static function createObject($config)
{ {
...@@ -372,9 +376,9 @@ class YiiBase ...@@ -372,9 +376,9 @@ class YiiBase
$object = $r->newInstanceArgs($args); $object = $r->newInstanceArgs($args);
} }
$c = get_class($object); $class = '\\' . get_class($object);
if (isset(\Yii::$objectConfig[$c])) { if (isset(\Yii::$objectConfig[$class])) {
$config = array_merge(\Yii::$objectConfig[$c], $config); $config = array_merge(\Yii::$objectConfig[$class], $config);
} }
foreach ($config as $name => $value) { foreach ($config as $name => $value) {
......
...@@ -461,11 +461,8 @@ class Component extends Object ...@@ -461,11 +461,8 @@ class Component extends Object
*/ */
public function attachBehavior($name, $behavior) public function attachBehavior($name, $behavior)
{ {
if (!($behavior instanceof Behavior)) { $this->ensureBehaviors();
$behavior = \Yii::createObject($behavior); return $this->attachBehaviorInternal($name, $behavior);
}
$behavior->attach($this);
return $this->_b[$name] = $behavior;
} }
/** /**
...@@ -478,8 +475,9 @@ class Component extends Object ...@@ -478,8 +475,9 @@ class Component extends Object
*/ */
public function attachBehaviors($behaviors) public function attachBehaviors($behaviors)
{ {
$this->ensureBehaviors();
foreach ($behaviors as $name => $behavior) { foreach ($behaviors as $name => $behavior) {
$this->attachBehavior($name, $behavior); $this->attachBehaviorInternal($name, $behavior);
} }
} }
...@@ -523,8 +521,23 @@ class Component extends Object ...@@ -523,8 +521,23 @@ class Component extends Object
if ($this->_b === null) { if ($this->_b === null) {
$this->_b = array(); $this->_b = array();
foreach ($this->behaviors() as $name => $behavior) { foreach ($this->behaviors() as $name => $behavior) {
$this->attachBehavior($name, $behavior); $this->attachBehaviorInternal($name, $behavior);
} }
} }
} }
/**
* Attaches a behavior to this component.
* @param string $name the name of the behavior.
* @param string|array|Behavior $behavior the behavior to be attached
* @return Behavior the attached behavior.
*/
private function attachBehaviorInternal($name, $behavior)
{
if (!($behavior instanceof Behavior)) {
$behavior = \Yii::createObject($behavior);
}
$behavior->attach($this);
return $this->_b[$name] = $behavior;
}
} }
...@@ -300,8 +300,7 @@ class Object ...@@ -300,8 +300,7 @@ class Object
*/ */
public static function newInstance($config = array()) public static function newInstance($config = array())
{ {
$c = get_called_class(); $class = '\\' . get_called_class();
$class = '\\' . $c;
if (($n = func_num_args()-1) > 0) { if (($n = func_num_args()-1) > 0) {
$args = func_get_args(); $args = func_get_args();
...@@ -321,8 +320,8 @@ class Object ...@@ -321,8 +320,8 @@ class Object
$object = $r->newInstanceArgs($args); $object = $r->newInstanceArgs($args);
} }
if (isset(\Yii::$objectConfig[$c])) { if (isset(\Yii::$objectConfig[$class])) {
$config = array_merge(\Yii::$objectConfig[$c], $config); $config = array_merge(\Yii::$objectConfig[$class], $config);
} }
foreach ($config as $name => $value) { foreach ($config as $name => $value) {
......
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
namespace yii\db\ar; namespace yii\db\ar;
use yii\db\dao\BaseQuery;
use yii\base\VectorIterator;
/** /**
* ActiveFinder.php is ... * ActiveFinder.php is ...
* todo: add SQL monitor * todo: add SQL monitor
...@@ -17,18 +20,18 @@ namespace yii\db\ar; ...@@ -17,18 +20,18 @@ namespace yii\db\ar;
* @author Qiang Xue <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0 * @since 2.0
*/ */
class ActiveQuery extends \yii\db\dao\BaseQuery implements \IteratorAggregate, \ArrayAccess, \Countable class ActiveQuery extends BaseQuery implements \IteratorAggregate, \ArrayAccess, \Countable
{ {
public $modelClass; public $modelClass;
public $with; public $with;
public $alias; public $alias;
public $index; public $indexBy;
public $asArray;
private $_count; private $_count;
private $_sql; private $_sql;
private $_countSql; private $_countSql;
private $_asArray;
private $_records; private $_records;
public function all() public function all()
...@@ -51,7 +54,26 @@ class ActiveQuery extends \yii\db\dao\BaseQuery implements \IteratorAggregate, \ ...@@ -51,7 +54,26 @@ class ActiveQuery extends \yii\db\dao\BaseQuery implements \IteratorAggregate, \
public function asArray($value = true) public function asArray($value = true)
{ {
$this->_asArray = $value; $this->asArray = $value;
return $this;
}
public function with()
{
$this->with = func_get_args();
return $this;
}
public function indexBy($column)
{
$this->indexBy = $column;
return $this;
}
public function alias($tableAlias)
{
$this->alias = $tableAlias;
return $this;
} }
protected function performQuery() protected function performQuery()
...@@ -74,10 +96,6 @@ class ActiveQuery extends \yii\db\dao\BaseQuery implements \IteratorAggregate, \ ...@@ -74,10 +96,6 @@ class ActiveQuery extends \yii\db\dao\BaseQuery implements \IteratorAggregate, \
return $records; return $records;
} }
public function with()
{
}
// //
// public function getSql($connection = null) // public function getSql($connection = null)
// { // {
...@@ -150,7 +168,7 @@ class ActiveQuery extends \yii\db\dao\BaseQuery implements \IteratorAggregate, \ ...@@ -150,7 +168,7 @@ class ActiveQuery extends \yii\db\dao\BaseQuery implements \IteratorAggregate, \
public function getIterator() public function getIterator()
{ {
$records = $this->performQuery(); $records = $this->performQuery();
return new \yii\base\VectorIterator($records); return new VectorIterator($records);
} }
/** /**
......
...@@ -43,7 +43,7 @@ class Query extends BaseQuery ...@@ -43,7 +43,7 @@ class Query extends BaseQuery
{ {
/** /**
* @var array the operation that this query represents. This refers to the method call as well as * @var array the operation that this query represents. This refers to the method call as well as
* the corresponding parameters for constructing a non-query SQL statement (e.g. INSERT, CREATE TABLE). * the corresponding parameters for constructing a non-select SQL statement (e.g. INSERT, CREATE TABLE).
* This property is mainly maintained by methods such as [[insert()]], [[update()]], [[createTable()]]. * This property is mainly maintained by methods such as [[insert()]], [[update()]], [[createTable()]].
* If this property is not set, it means this query represents a SELECT statement. * If this property is not set, it means this query represents a SELECT statement.
*/ */
......
...@@ -31,6 +31,9 @@ Upgrading from v1.1.x ...@@ -31,6 +31,9 @@ Upgrading from v1.1.x
- The root alias `@yii` now represents the framework installation directory. - The root alias `@yii` now represents the framework installation directory.
In 1.x, this is named as `system`. We also removed `zii` root alias. In 1.x, this is named as `system`. We also removed `zii` root alias.
- Object serves as the base class that supports properties. And Component extends
from Object and supports events and behaviors. Behaviors declared in
Component::behaviors() are attached on demand.
- `CList` is renamed to `Vector`, and `CMap` is renamed to `Dictionary`. - `CList` is renamed to `Vector`, and `CMap` is renamed to `Dictionary`.
Other collection classes are dropped in favor of SPL classes. Other collection classes are dropped in favor of SPL classes.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment