entity generator - ignore trait properties and methods #632

Merged
merged 11 commits into from Jul 7, 2013
View
32 lib/Doctrine/ORM/Tools/EntityGenerator.php
@@ -709,6 +709,13 @@ protected function hasProperty($property, ClassMetadataInfo $metadata)
}
}
+ // check traits for existing property
+ foreach ($this->getTraits($metadata) as $trait) {
+ if ($trait->hasProperty($property)) {
+ return true;
+ }
+ }
+
return (
isset($this->staticReflection[$metadata->name]) &&
in_array($property, $this->staticReflection[$metadata->name]['properties'])
@@ -732,6 +739,13 @@ protected function hasMethod($method, ClassMetadataInfo $metadata)
}
}
+ // check traits for existing method
+ foreach ($this->getTraits($metadata) as $trait) {
+ if ($trait->hasMethod($method)) {
+ return true;
+ }
+ }
+
return (
isset($this->staticReflection[$metadata->name]) &&
in_array($method, $this->staticReflection[$metadata->name]['methods'])
@@ -741,6 +755,24 @@ protected function hasMethod($method, ClassMetadataInfo $metadata)
/**
* @param ClassMetadataInfo $metadata
*
+ * @return array
+ */
+ protected function getTraits(ClassMetadataInfo $metadata)
+ {
+ if (PHP_VERSION_ID >= 50400 && ($metadata->reflClass !== null || class_exists($metadata->name))) {
+ $reflClass = $metadata->reflClass === null
+ ? new \ReflectionClass($metadata->name)
+ : $metadata->reflClass;
+
+ return $reflClass->getTraits();
+ }
+
+ return array();
+ }
+
+ /**
+ * @param ClassMetadataInfo $metadata
+ *
* @return bool
*/
protected function hasNamespace(ClassMetadataInfo $metadata)
View
45 tests/Doctrine/Tests/Models/DDC2372/DDC2372Address.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Doctrine\Tests\Models\DDC2372;
+
+/** @Entity @Table(name="addresses") */
+class DDC2372Address
+{
+ /**
+ * @Id @Column(type="integer")
+ * @GeneratedValue(strategy="AUTO")
+ */
+ private $id;
+ /** @Column(type="string", length=255) */
+ private $street;
+ /** @OneToOne(targetEntity="User", mappedBy="address") */
+ private $user;
+
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ public function getStreet()
+ {
+ return $this->street;
+ }
+
+ public function setStreet($street)
+ {
+ $this->street = $street;
+ }
+
+ public function getUser()
+ {
+ return $this->user;
+ }
+
+ public function setUser(User $user)
+ {
+ if ($this->user !== $user) {
+ $this->user = $user;
+ $user->setAddress($this);
+ }
+ }
+}
View
34 tests/Doctrine/Tests/Models/DDC2372/DDC2372User.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Doctrine\Tests\Models\DDC2372;
+
+use Doctrine\Tests\Models\DDC2372\Traits\DDC2372AddressTrait;
+
+/** @Entity @Table(name="users") */
+class DDC2372User
+{
+ use DDC2372AddressTrait;
+
+ /**
+ * @Id @Column(type="integer")
+ * @GeneratedValue(strategy="AUTO")
+ */
+ private $id;
+ /** @Column(type="string", length=50) */
+ private $name;
+
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ public function setName($name)
+ {
+ $this->name = $name;
+ }
+}
View
25 tests/Doctrine/Tests/Models/DDC2372/Traits/DDC2372AddressTrait.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Doctrine\Tests\Models\DDC2372\Traits;
+
+trait DDC2372AddressTrait
+{
+ /**
+ * @OneToOne(targetEntity="Doctrine\Tests\Models\DDC2372\DDC2372Address", inversedBy="user")
+ * @JoinColumn(name="address_id", referencedColumnName="id")
+ */
+ private $address;
+
+ public function getAddress()
+ {
+ return $this->address;
+ }
+
+ public function setAddress(Address $address)
+ {
+ if ($this->address !== $address) {
+ $this->address = $address;
+ $address->setUser($this);
+ }
+ }
+}
View
60 tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php
@@ -2,10 +2,12 @@
namespace Doctrine\Tests\ORM\Tools;
-use Doctrine\ORM\Tools\SchemaTool,
- Doctrine\ORM\Tools\EntityGenerator,
- Doctrine\ORM\Tools\Export\ClassMetadataExporter,
- Doctrine\ORM\Mapping\ClassMetadataInfo;
+use Doctrine\ORM\Tools\SchemaTool;
+use Doctrine\ORM\Tools\EntityGenerator;
+use Doctrine\ORM\Tools\Export\ClassMetadataExporter;
+use Doctrine\ORM\Mapping\ClassMetadataInfo;
+use Doctrine\ORM\Mapping\ClassMetadataFactory;
+use Doctrine\Tests\Models\DDC2372\DDC2372User;
require_once __DIR__ . '/../../TestInit.php';
@@ -282,7 +284,7 @@ public function testGenerateEntityWithSequenceGenerator()
$filename = $this->_tmpDir . DIRECTORY_SEPARATOR
. $this->_namespace . DIRECTORY_SEPARATOR . 'DDC1784Entity.php';
-
+
$this->assertFileExists($filename);
require_once $filename;
@@ -330,7 +332,7 @@ public function testGenerateEntityWithMultipleInverseJoinColumns()
$property = new \ReflectionProperty($metadata->name, 'centroCustos');
$docComment = $property->getDocComment();
-
+
//joinColumns
$this->assertContains('@JoinColumn(name="idorcamento", referencedColumnName="idorcamento"),', $docComment);
$this->assertContains('@JoinColumn(name="idunidade", referencedColumnName="idunidade")', $docComment);
@@ -436,7 +438,7 @@ public function testEntityTypeAlias(array $field)
$entity = new $metadata->name;
$reflClass = new \ReflectionClass($metadata->name);
-
+
$type = $field['phpType'];
$name = $field['fieldName'];
$value = $field['value'];
@@ -452,6 +454,36 @@ public function testEntityTypeAlias(array $field)
}
/**
+ * @group DDC-2372
+ */
+ public function testTraitPropertiesAndMethodsAreNotDuplicated()
+ {
+ if (PHP_VERSION_ID < 50400) {
+ $this->markTestSkipped('Traits are not available before php 5.4.');
+ }
+
+ $cmf = new ClassMetadataFactory();
+ $em = $this->_getTestEntityManager();
+ $cmf->setEntityManager($em);
+
+ $user = new DDC2372User();
+ $metadata = $cmf->getMetadataFor(get_class($user));
+ $metadata->name = $this->_namespace . "\DDC2372User";
+ $metadata->namespace = $this->_namespace;
+
+ $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
+
+ $this->assertFileExists($this->_tmpDir . "/" . $this->_namespace . "/DDC2372User.php");
+ require $this->_tmpDir . "/" . $this->_namespace . "/DDC2372User.php";
+
+ $reflClass = new \ReflectionClass($metadata->name);
+
+ $this->assertSame($reflClass->hasProperty('address'), false);
+ $this->assertSame($reflClass->hasMethod('setAddress'), false);
+ $this->assertSame($reflClass->hasMethod('getAddress'), false);
+ }
+
+ /**
* @return array
*/
public function getEntityTypeAliasDataProvider()
@@ -470,43 +502,43 @@ public function getEntityTypeAliasDataProvider()
'value' => new \DateTime
)),
array(array(
- 'fieldName' => 'date',
+ 'fieldName' => 'date',
'phpType' => '\\DateTime',
'dbType' => 'date',
'value' => new \DateTime
)),
array(array(
- 'fieldName' => 'time',
+ 'fieldName' => 'time',
'phpType' => '\DateTime',
'dbType' => 'time',
'value' => new \DateTime
)),
array(array(
- 'fieldName' => 'object',
+ 'fieldName' => 'object',
'phpType' => '\stdClass',
'dbType' => 'object',
'value' => new \stdClass()
)),
array(array(
- 'fieldName' => 'bigint',
+ 'fieldName' => 'bigint',
'phpType' => 'integer',
'dbType' => 'bigint',
'value' => 11
)),
array(array(
- 'fieldName' => 'smallint',
+ 'fieldName' => 'smallint',
'phpType' => 'integer',
'dbType' => 'smallint',
'value' => 22
)),
array(array(
- 'fieldName' => 'text',
+ 'fieldName' => 'text',
'phpType' => 'string',
'dbType' => 'text',
'value' => 'text'
)),
array(array(
- 'fieldName' => 'blob',
+ 'fieldName' => 'blob',
'phpType' => 'string',
'dbType' => 'blob',
'value' => 'blob'