Last active
November 5, 2019 06:18
-
-
Save rilwanfit/e10a406109ad67f852064f6d3e61b3e4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\DataFixtures; | |
use Doctrine\Bundle\FixturesBundle\Fixture; | |
use Doctrine\Common\Persistence\ObjectManager; | |
use Faker\Factory; | |
use Faker\Generator; | |
abstract class BaseFixture extends Fixture | |
{ | |
/** @var ObjectManager */ | |
private $manager; | |
/** @var Generator */ | |
protected $faker; | |
private $referencesIndex = []; | |
abstract protected function loadData(ObjectManager $manager); | |
public function load(ObjectManager $manager) | |
{ | |
$this->manager = $manager; | |
$this->faker = Factory::create(); | |
$this->loadData($manager); | |
} | |
/** | |
* Create many objects at once: | |
* | |
* $this->createMany(10, function(int $i) { | |
* $user = new User(); | |
* $user->setFirstName('Ryan'); | |
* | |
* return $user; | |
* }); | |
* | |
* @param int $count | |
* @param string $groupName Tag these created objects with this group name, | |
* and use this later with getRandomReference(s) | |
* to fetch only from this specific group. | |
* @param callable $factory | |
*/ | |
protected function createMany(int $count, string $groupName, callable $factory) | |
{ | |
for ($i = 0; $i < $count; $i++) { | |
$entity = $factory($i); | |
if (null === $entity) { | |
throw new \LogicException('Did you forget to return the entity object from your callback to BaseFixture::createMany()?'); | |
} | |
$this->manager->persist($entity); | |
// store for usage later as groupName_#COUNT# | |
$this->addReference(sprintf('%s_%d', $groupName, $i), $entity); | |
} | |
} | |
protected function getRandomReference(string $groupName) { | |
if (!isset($this->referencesIndex[$groupName])) { | |
$this->referencesIndex[$groupName] = []; | |
foreach ($this->referenceRepository->getReferences() as $key => $ref) { | |
if (strpos($key, $groupName.'_') === 0) { | |
$this->referencesIndex[$groupName][] = $key; | |
} | |
} | |
} | |
if (empty($this->referencesIndex[$groupName])) { | |
throw new \InvalidArgumentException(sprintf('Did not find any references saved with the group name "%s"', $groupName)); | |
} | |
$randomReferenceKey = $this->faker->randomElement($this->referencesIndex[$groupName]); | |
return $this->getReference($randomReferenceKey); | |
} | |
protected function getRandomReferences(string $className, int $count) | |
{ | |
$references = []; | |
while (count($references) < $count) { | |
$references[] = $this->getRandomReference($className); | |
} | |
return $references; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment