Skip to content

Commit

Permalink
Merge pull request #1098 from encoder32/DDC-1590
Browse files Browse the repository at this point in the history
#DDC-1590: Fix Inheritance in Code-Generation
  • Loading branch information
Ocramius committed Aug 18, 2014
2 parents c20b3a7 + cd4bc93 commit ff80187
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 4 deletions.
8 changes: 4 additions & 4 deletions lib/Doctrine/ORM/Tools/EntityGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -714,9 +714,9 @@ protected function parseTokensInEntityFile($src)
*/
protected function hasProperty($property, ClassMetadataInfo $metadata)
{
if ($this->extendsClass()) {
if ($this->extendsClass() || class_exists($metadata->name)) {
// don't generate property if its already on the base class.
$reflClass = new \ReflectionClass($this->getClassToExtend());
$reflClass = new \ReflectionClass($this->getClassToExtend() ?: $metadata->name);
if ($reflClass->hasProperty($property)) {
return true;
}
Expand All @@ -743,9 +743,9 @@ protected function hasProperty($property, ClassMetadataInfo $metadata)
*/
protected function hasMethod($method, ClassMetadataInfo $metadata)
{
if ($this->extendsClass()) {
if ($this->extendsClass() || class_exists($metadata->name)) {
// don't generate method if its already on the base class.
$reflClass = new \ReflectionClass($this->getClassToExtend());
$reflClass = new \ReflectionClass($this->getClassToExtend() ?: $metadata->name);

if ($reflClass->hasMethod($method)) {
return true;
Expand Down
56 changes: 56 additions & 0 deletions tests/Doctrine/Tests/Models/DDC1590/DDC1590Entity.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

namespace Doctrine\Tests\Models\DDC1590;

/**
* @Entity
* @MappedSuperClass
*/
abstract class DDC1590Entity
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @Column(type="datetime")
*/
protected $created_at;

/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}

/**
* Set createdAt
*
* @param \DateTime $createdAt
*
* @return DDC1590User
*/
public function setCreatedAt($createdAt)
{
$this->created_at = $createdAt;

return $this;
}

/**
* Get createdAt
*
* @return \DateTime
*/
public function getCreatedAt()
{
return $this->created_at;
}
}
18 changes: 18 additions & 0 deletions tests/Doctrine/Tests/Models/DDC1590/DDC1590User.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace Doctrine\Tests\Models\DDC1590;

use Doctrine\Tests\Models\DDC1590\DDC1590Entity;

/**
* @Entity
* @Table(name="users")
*/
class DDC1590User extends DDC1590Entity
{
/**
* @Column(type="string", length=255)
*/
protected $name;

}
73 changes: 73 additions & 0 deletions tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,79 @@ public function testTraitPropertiesAndMethodsAreNotDuplicatedInChildClasses()
$this->assertSame($reflClass->hasMethod('getAddress'), false);
}

/**
* @group DDC-1590
*/
public function testMethodsAndPropertiesAreNotDuplicatedInChildClasses()
{
$cmf = new ClassMetadataFactory();
$em = $this->_getTestEntityManager();

$cmf->setEntityManager($em);

$ns = $this->_namespace;
$nsdir = $this->_tmpDir . '/' . $ns;

$content = str_replace(
'namespace Doctrine\Tests\Models\DDC1590',
'namespace ' . $ns,
file_get_contents(__DIR__ . '/../../Models/DDC1590/DDC1590User.php')
);

$fname = $nsdir . "/DDC1590User.php";
file_put_contents($fname, $content);
require $fname;


$metadata = $cmf->getMetadataFor($ns . '\DDC1590User');
$this->_generator->writeEntityClass($metadata, $this->_tmpDir);

// class DDC1590User extends DDC1590Entity { ... }
$source = file_get_contents($fname);

// class _DDC1590User extends DDC1590Entity { ... }
$source2 = str_replace('class DDC1590User', 'class _DDC1590User', $source);
$fname2 = $nsdir . "/_DDC1590User.php";
file_put_contents($fname2, $source2);
require $fname2;

// class __DDC1590User { ... }
$source3 = str_replace('class DDC1590User extends DDC1590Entity', 'class __DDC1590User', $source);
$fname3 = $nsdir . "/__DDC1590User.php";
file_put_contents($fname3, $source3);
require $fname3;


// class _DDC1590User extends DDC1590Entity { ... }
$rc2 = new \ReflectionClass($ns.'\_DDC1590User');

$this->assertTrue($rc2->hasProperty('name'));
$this->assertTrue($rc2->hasProperty('id'));
$this->assertTrue($rc2->hasProperty('created_at'));

$this->assertTrue($rc2->hasMethod('getName'));
$this->assertTrue($rc2->hasMethod('setName'));
$this->assertTrue($rc2->hasMethod('getId'));
$this->assertFalse($rc2->hasMethod('setId'));
$this->assertTrue($rc2->hasMethod('getCreatedAt'));
$this->assertTrue($rc2->hasMethod('setCreatedAt'));


// class __DDC1590User { ... }
$rc3 = new \ReflectionClass($ns.'\__DDC1590User');

$this->assertTrue($rc3->hasProperty('name'));
$this->assertFalse($rc3->hasProperty('id'));
$this->assertFalse($rc3->hasProperty('created_at'));

$this->assertTrue($rc3->hasMethod('getName'));
$this->assertTrue($rc3->hasMethod('setName'));
$this->assertFalse($rc3->hasMethod('getId'));
$this->assertFalse($rc3->hasMethod('setId'));
$this->assertFalse($rc3->hasMethod('getCreatedAt'));
$this->assertFalse($rc3->hasMethod('setCreatedAt'));
}

/**
* @return array
*/
Expand Down

0 comments on commit ff80187

Please sign in to comment.