Merge pull request #632 from Padam87/entgentrait
entity generator - ignore trait properties and methods
This commit is contained in:
commit
78fc129614
@ -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
|
||||
*
|
||||
|
45
tests/Doctrine/Tests/Models/DDC2372/DDC2372Address.php
Normal file
45
tests/Doctrine/Tests/Models/DDC2372/DDC2372Address.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
34
tests/Doctrine/Tests/Models/DDC2372/DDC2372User.php
Normal file
34
tests/Doctrine/Tests/Models/DDC2372/DDC2372User.php
Normal 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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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';
|
||||
|
||||
@ -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
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user