diff --git a/lib/Doctrine/ORM/Mapping/Builder/FieldBuilder.php b/lib/Doctrine/ORM/Mapping/Builder/FieldBuilder.php index 425840aaf..934a6b735 100644 --- a/lib/Doctrine/ORM/Mapping/Builder/FieldBuilder.php +++ b/lib/Doctrine/ORM/Mapping/Builder/FieldBuilder.php @@ -54,6 +54,11 @@ class FieldBuilder */ private $sequenceDef; + /** + * @var string|null + */ + private $customIdGenerator; + /** * @param ClassMetadataBuilder $builder * @param array $mapping @@ -232,6 +237,21 @@ class FieldBuilder return $this; } + /** + * Set the FQCN of the custom ID generator. + * This class must extend \Doctrine\ORM\Id\AbstractIdGenerator. + * + * @param string $customIdGenerator + * + * @return $this + */ + public function setCustomIdGenerator($customIdGenerator) + { + $this->customIdGenerator = (string) $customIdGenerator; + + return $this; + } + /** * Finalizes this field and attach it to the ClassMetadata. * @@ -245,13 +265,20 @@ class FieldBuilder if ($this->generatedValue) { $cm->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' . $this->generatedValue)); } + if ($this->version) { $cm->setVersionMapping($this->mapping); } + $cm->mapField($this->mapping); if ($this->sequenceDef) { $cm->setSequenceGeneratorDefinition($this->sequenceDef); } + + if ($this->customIdGenerator) { + $cm->setCustomGeneratorDefinition(['class' => $this->customIdGenerator]); + } + return $this->builder; } } diff --git a/tests/Doctrine/Tests/ORM/Mapping/FieldBuilderTest.php b/tests/Doctrine/Tests/ORM/Mapping/FieldBuilderTest.php new file mode 100644 index 000000000..f882dacc4 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/FieldBuilderTest.php @@ -0,0 +1,41 @@ +. + */ + +namespace Doctrine\Tests\ORM\Mapping; + +use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder; +use Doctrine\ORM\Mapping\ClassMetadataInfo; + +class FieldBuilderTest extends \Doctrine\Tests\OrmTestCase +{ + public function testCustomIdGeneratorCanBeSet() + { + $cmBuilder = new ClassMetadataBuilder(new ClassMetadataInfo('Doctrine\Tests\Models\CMS\CmsUser')); + + $fieldBuilder = $cmBuilder->createField('aField', 'string'); + + $fieldBuilder->generatedValue('CUSTOM'); + $fieldBuilder->setCustomIdGenerator('stdClass'); + + $fieldBuilder->build(); + + $this->assertEquals(ClassMetadataInfo::GENERATOR_TYPE_CUSTOM, $cmBuilder->getClassMetadata()->generatorType); + $this->assertEquals(['class' => 'stdClass'], $cmBuilder->getClassMetadata()->customGeneratorDefinition); + } +}