Наглядный порядок фикстур при использовании doctrine/data-fixtures
09.08.2020 doctrine, fixture, testingПо мере роста проекта растут и фикстуры к нему (если конечно вы пишите тесты). И бывает что нам нужно переставить некоторые фикстуры местами или втиснуть новые между определенных. В таком случае можно вручную обойти все фикстуры и выписать порядковые номера. А можно написать команду, которая сделает это за нас, чтобы получилась такая "картина":
$ php bin/console doctrine:fixture:show-order
- [1]: MobileAppFixture
- [1]: MailingListTemplateFixture
- [1]: ProvideServiceFixture
- [10]: PackMatrixFactorFixture
- [10]: DemandMatrixFactorFixture
и т.д.
Сниппет команды:
Для работы необходимо использовать
symfony/console
.
<?php declare(strict_types=1);
namespace App\Command;
use Doctrine\Common\DataFixtures\Loader;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use ReflectionClass;
use function usort;
use function sprintf;
class OrderFixtureCommand extends Command
{
private const FIXTURE_DIR = __DIR__ . '/../../fixtures';
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return int|void|null
* @throws \ReflectionException
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$loader = new Loader();
/** @var OrderedFixtureInterface[] $fixtures */
$fixtures = $loader->loadFromDirectory(self::FIXTURE_DIR);
usort($fixtures, function (OrderedFixtureInterface $a, OrderedFixtureInterface $b) {
return $a->getOrder() <=> $b->getOrder();
});
foreach ($fixtures as $fixture) {
$output->writeln(sprintf(
'- <info>[%d]</info>: %s',
$fixture->getOrder(),
(new ReflectionClass($fixture))->getShortName()
));
}
}
protected function configure()
{
$this->setName('doctrine:fixture:show-order')->setDescription('Display order of the fixtures');
}
}
В константе FIXTURE_DIR
нужно указать путь до директории с фикстурами проекта.