Ми}{@лbI4

Блог хеллоуворлдщика

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