Skip to content

Instantly share code, notes, and snippets.

@rilwanfit
Last active November 5, 2019 06:18
Show Gist options
  • Save rilwanfit/e10a406109ad67f852064f6d3e61b3e4 to your computer and use it in GitHub Desktop.
Save rilwanfit/e10a406109ad67f852064f6d3e61b3e4 to your computer and use it in GitHub Desktop.
<?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