From 82daf651fbf51765b8cee7dc81a3f4d95b00ebbc Mon Sep 17 00:00:00 2001 From: Vitali Date: Wed, 23 Nov 2011 13:51:45 +0300 Subject: [PATCH] Pass specified arguments to generator's constructor --- .../ORM/Mapping/ClassMetadataFactory.php | 12 ++++--- .../ORM/Mapping/ClassMetadataInfo.php | 17 ++++++++++ .../ORM/Mapping/ClassMetadataFactoryTest.php | 33 ++++++++++++++++++- 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index 4d93badad..51b6339aa 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -506,10 +506,14 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface break; case ClassMetadata::GENERATOR_TYPE_CUSTOM: $definition = $class->customGeneratorDefinition; - if (class_exists($definition['class'])) { - $class->setIdGenerator(new $definition['class']); - } else { - throw new ORMException("Can't find custom generator class: " . + try { + $reflection = new \ReflectionClass($definition['class']); + $args = isset($definition['args']) ? + $definition['args'] : array(); + $generator = $reflection->newInstanceArgs($args); + $class->setIdGenerator($generator); + } catch (ReflectionException $e) { + throw new ORMException("Can't instantiate custom generator : " . $definition['class']); } break; diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index 56eaaa606..2f78d18a1 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -180,6 +180,23 @@ class ClassMetadataInfo implements ClassMetadata */ public $rootEntityName; + /** + * READ-ONLY: The definition of custom generator. Only used for CUSTOM + * generator type + * + * The definition has the following structure: + * + * array( + * 'class' => 'ClassName', + * 'args' => array("constructor", "arguments") + * ) + * + * + * @var array + * @todo Merge with tableGeneratorDefinition into generic generatorDefinition + */ + public $customGeneratorDefinition; + /** * The name of the custom repository class used for the entity class. * (Optional). diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php index 91f94aa75..a5d12f199 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php @@ -61,10 +61,27 @@ class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals(ClassMetadata::GENERATOR_TYPE_CUSTOM, $actual->generatorType); - $this->assertInstanceOf("Doctrine\Tests\ORM\Mapping\CustomIdGenerator", + $this->assertInstanceOf("Doctrine\Tests\ORM\Mapping\CustomIdGenerator", $actual->idGenerator); } + public function testGetMetadataFor_PasesArgumentsToGeneratorsConstructor() { + $cm1 = $this->_createValidClassMetadata(); + $cm1->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_CUSTOM); + $cm1->customGeneratorDefinition = array( + "class" => "Doctrine\Tests\ORM\Mapping\CustomIdGenerator", + "args" => array("parameter")); + $cmf = $this->_createTestFactory(); + $cmf->setMetadataForClass($cm1->name, $cm1); + $expected = new CustomIdGenerator("parameter"); + + $actual = $cmf->getMetadataFor($cm1->name); + + $this->assertEquals(ClassMetadata::GENERATOR_TYPE_CUSTOM, + $actual->generatorType); + $this->assertEquals($expected, $actual->idGenerator); + } + public function testGetMetadataFor_ThrowsExceptionOnUnknownCustomGeneratorClass() { $cm1 = $this->_createValidClassMetadata(); $cm1->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_CUSTOM); @@ -75,6 +92,16 @@ class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase $actual = $cmf->getMetadataFor($cm1->name); } + + public function testGetMetadataFor_ThrowsExceptionOnMissingCustomGeneratorDefinition() { + $cm1 = $this->_createValidClassMetadata(); + $cm1->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_CUSTOM); + $cmf = $this->_createTestFactory(); + $cmf->setMetadataForClass($cm1->name, $cm1); + $this->setExpectedException("Doctrine\ORM\ORMException"); + + $actual = $cmf->getMetadataFor($cm1->name); + } public function testHasGetMetadata_NamespaceSeperatorIsNotNormalized() { @@ -227,5 +254,9 @@ class TestEntity1 } class CustomIdGenerator extends \Doctrine\ORM\Id\AbstractIdGenerator { + public $parameter; + public function __construct($parameter = null) { + $this->parameter = $parameter; + } public function generate(\Doctrine\ORM\EntityManager $em, $entity) {} }