diff --git a/lib/Doctrine/Common/DataFixtures/Loader.php b/lib/Doctrine/Common/DataFixtures/Loader.php index 5c5b0e54..01418404 100644 --- a/lib/Doctrine/Common/DataFixtures/Loader.php +++ b/lib/Doctrine/Common/DataFixtures/Loader.php @@ -135,7 +135,7 @@ public function addFixture(FixtureInterface $fixture) } elseif ($fixture instanceof DependentFixtureInterface) { $this->orderFixturesByDependencies = true; foreach($fixture->getDependencies() as $class) { - if (class_exists($class)) { + if (!isset($this->fixtures[$fixtureClass]) && class_exists($class)) { $this->addFixture($this->createFixture($class)); } } diff --git a/tests/Doctrine/Tests/Common/DataFixtures/LoaderTest.php b/tests/Doctrine/Tests/Common/DataFixtures/LoaderTest.php index 0b6e3f73..455e66bc 100644 --- a/tests/Doctrine/Tests/Common/DataFixtures/LoaderTest.php +++ b/tests/Doctrine/Tests/Common/DataFixtures/LoaderTest.php @@ -2,9 +2,11 @@ namespace Doctrine\Tests\Common\DataFixtures; +use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Common\DataFixtures\FixtureInterface; use Doctrine\Common\DataFixtures\Loader; use Doctrine\Common\DataFixtures\SharedFixtureInterface; +use Doctrine\Common\Persistence\ObjectManager; use TestFixtures\MyFixture1; use TestFixtures\NotAFixture; @@ -58,4 +60,44 @@ public function testGetFixture() $this->assertInstanceOf(MyFixture1::class, $fixture); } + + public function testAddFixtureDoesNotCreateFixtureDependencyIfAlreadyAdded() + { + $loader = new Loader(); + + $a = new AlreadyAddedFixture(); + + $loader->addFixture($a); + + $b = new DependentOnAlreadyAddedFixture(); + + $loader->addFixture($b); + + $this->assertEquals(1, AlreadyAddedFixture::$called, 'Should only have called the constructor once'); + } } + +class AlreadyAddedFixture implements FixtureInterface +{ + static $called = 0; + + public function __construct() + { + static::$called += 1; + } + + public function load(ObjectManager $manager) + {} +} + +class DependentOnAlreadyAddedFixture implements FixtureInterface, DependentFixtureInterface +{ + public function load(ObjectManager $manager) + {} + + public function getDependencies() + { + return [AlreadyAddedFixture::class]; + } +} +