1
0
mirror of synced 2025-01-20 07:21:40 +03:00

Merge pull request #632 from Padam87/entgentrait

entity generator - ignore trait properties and methods
This commit is contained in:
Guilherme Blanco 2013-07-07 12:37:55 -07:00
commit 78fc129614
5 changed files with 182 additions and 14 deletions

View File

@ -709,6 +709,13 @@ public function __construct()
}
}
// 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,12 +739,37 @@ public function __construct()
}
}
// 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'])
);
}
/**
* @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
*

View File

@ -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 File

@ -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 File

@ -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 File

@ -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';
@ -285,7 +287,7 @@ class EntityGeneratorTest extends \Doctrine\Tests\OrmTestCase
$filename = $this->_tmpDir . DIRECTORY_SEPARATOR
. $this->_namespace . DIRECTORY_SEPARATOR . 'DDC1784Entity.php';
$this->assertFileExists($filename);
require_once $filename;
@ -333,7 +335,7 @@ class EntityGeneratorTest extends \Doctrine\Tests\OrmTestCase
$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);
@ -439,7 +441,7 @@ class EntityGeneratorTest extends \Doctrine\Tests\OrmTestCase
$entity = new $metadata->name;
$reflClass = new \ReflectionClass($metadata->name);
$type = $field['phpType'];
$name = $field['fieldName'];
$value = $field['value'];
@ -454,6 +456,36 @@ class EntityGeneratorTest extends \Doctrine\Tests\OrmTestCase
$this->assertEquals($value, $entity->{$getter}());
}
/**
* @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
*/
@ -473,43 +505,43 @@ class EntityGeneratorTest extends \Doctrine\Tests\OrmTestCase
'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'