Наглядный порядок фикстур при использовании 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
нужно указать путь до директории с фикстурами проекта.