Allowed behaviors to be aliased by setting the 'alias' key

This commit is contained in:
Jeremy Harris 2011-01-09 18:28:05 -08:00
parent 9749dc808d
commit 24d90c17d6
2 changed files with 52 additions and 15 deletions

View file

@ -83,6 +83,16 @@ class BehaviorCollection extends ObjectCollection {
* to load a behavior with callbacks disabled. By default callbacks are enabled. Disable behaviors * to load a behavior with callbacks disabled. By default callbacks are enabled. Disable behaviors
* can still be used as normal. * can still be used as normal.
* *
* You can alias your behavior as an existing behavior by setting the 'alias' key, i.e.,
* {{{
* public $actsAs = array(
* 'AliasedTree' => array(
* 'alias' => 'Tree'
* );
* );
* }}}
* All calls to the `Tree` behavior would use `AliasedTree` instead.
*
* @param string $behavior CamelCased name of the behavior to load * @param string $behavior CamelCased name of the behavior to load
* @param array $config Behavior configuration parameters * @param array $config Behavior configuration parameters
* @return boolean True on success, false on failure * @return boolean True on success, false on failure
@ -91,6 +101,10 @@ class BehaviorCollection extends ObjectCollection {
public function load($behavior, $config = array()) { public function load($behavior, $config = array()) {
list($plugin, $name) = pluginSplit($behavior); list($plugin, $name) = pluginSplit($behavior);
$class = $name . 'Behavior'; $class = $name . 'Behavior';
$alias = $name;
if (isset($config['alias'])) {
$alias = $config['alias'];
}
if (!App::import('Behavior', $behavior)) { if (!App::import('Behavior', $behavior)) {
throw new MissingBehaviorFileException(array( throw new MissingBehaviorFileException(array(
@ -105,19 +119,19 @@ class BehaviorCollection extends ObjectCollection {
)); ));
} }
if (!isset($this->{$name})) { if (!isset($this->{$alias})) {
if (ClassRegistry::isKeySet($class)) { if (ClassRegistry::isKeySet($class)) {
$this->_loaded[$name] = ClassRegistry::getObject($class); $this->_loaded[$alias] = ClassRegistry::getObject($class);
} else { } else {
$this->_loaded[$name] = new $class(); $this->_loaded[$alias] = new $class();
ClassRegistry::addObject($class, $this->_loaded[$name]); ClassRegistry::addObject($class, $this->_loaded[$alias]);
if (!empty($plugin)) { if (!empty($plugin)) {
ClassRegistry::addObject($plugin . '.' . $class, $this->_loaded[$name]); ClassRegistry::addObject($plugin . '.' . $class, $this->_loaded[$alias]);
} }
} }
} elseif (isset($this->_loaded[$name]->settings) && isset($this->_loaded[$name]->settings[$this->modelName])) { } elseif (isset($this->_loaded[$alias]->settings) && isset($this->_loaded[$alias]->settings[$this->modelName])) {
if ($config !== null && $config !== false) { if ($config !== null && $config !== false) {
$config = array_merge($this->_loaded[$name]->settings[$this->modelName], $config); $config = array_merge($this->_loaded[$alias]->settings[$this->modelName], $config);
} else { } else {
$config = array(); $config = array();
} }
@ -125,12 +139,12 @@ class BehaviorCollection extends ObjectCollection {
if (empty($config)) { if (empty($config)) {
$config = array(); $config = array();
} }
$this->_loaded[$name]->setup(ClassRegistry::getObject($this->modelName), $config); $this->_loaded[$alias]->setup(ClassRegistry::getObject($this->modelName), $config);
foreach ($this->_loaded[$name]->mapMethods as $method => $alias) { foreach ($this->_loaded[$alias]->mapMethods as $method => $methodAlias) {
$this->_mappedMethods[$method] = array($name, $alias); $this->_mappedMethods[$method] = array($alias, $methodAlias);
} }
$methods = get_class_methods($this->_loaded[$name]); $methods = get_class_methods($this->_loaded[$alias]);
$parentMethods = array_flip(get_class_methods('ModelBehavior')); $parentMethods = array_flip(get_class_methods('ModelBehavior'));
$callbacks = array( $callbacks = array(
'setup', 'cleanup', 'beforeFind', 'afterFind', 'beforeSave', 'afterSave', 'setup', 'cleanup', 'beforeFind', 'afterFind', 'beforeSave', 'afterSave',
@ -144,16 +158,16 @@ class BehaviorCollection extends ObjectCollection {
!in_array($m, $callbacks) !in_array($m, $callbacks)
); );
if ($methodAllowed) { if ($methodAllowed) {
$this->_methods[$m] = array($name, $m); $this->_methods[$m] = array($alias, $m);
} }
} }
} }
$configDisabled = isset($config['enabled']) && $config['enabled'] === false; $configDisabled = isset($config['enabled']) && $config['enabled'] === false;
if (!in_array($name, $this->_enabled) && !$configDisabled) { if (!in_array($alias, $this->_enabled) && !$configDisabled) {
$this->enable($name); $this->enable($alias);
} elseif ($configDisabled) { } elseif ($configDisabled) {
$this->disable($name); $this->disable($alias);
} }
return true; return true;
} }

View file

@ -412,6 +412,12 @@ class Test7Behavior extends ModelBehavior{
} }
} }
/**
* Extended TestBehavior
*/
class TestAliasBehavior extends TestBehavior {
}
/** /**
* BehaviorCollection class * BehaviorCollection class
* *
@ -430,6 +436,23 @@ class BehaviorCollectionTest extends CakeTestCase {
'core.attachment', 'core.tag', 'core.articles_tag' 'core.attachment', 'core.tag', 'core.articles_tag'
); );
/**
* Tests loading aliased behaviors
*/
function testLoadAlias() {
$Apple = new Apple();
$this->assertIdentical($Apple->Behaviors->attached(), array());
$Apple->Behaviors->load('TestAlias', array('alias' => 'Test', 'somesetting' => true));
$this->assertIdentical($Apple->Behaviors->attached(), array('Test'));
$this->assertInstanceOf('TestAliasBehavior', $Apple->Behaviors->Test);
$this->assertTrue($Apple->Behaviors->Test->settings['Apple']['somesetting']);
$this->assertEquals($Apple->Behaviors->Test->testMethod($Apple, true), 'working');
$this->assertEquals($Apple->testMethod(true), 'working');
$this->assertEquals($Apple->Behaviors->dispatchMethod($Apple, 'testMethod'), 'working');
}
/** /**
* testBehaviorBinding method * testBehaviorBinding method
* *