Загрузка ресурсов для фикстуры

Часто для загрузки данныз в db, используются внешние ресурсы. Это могут xml файлы с данными, csv файлы и т.д. Подготовка данных для фикстур (например скопировать их в директорию, с которой работает фикстура) - задача для загрузчика ресурсов.

С помощью конфигов на уровне приложения, можно указать, какой загрузчик фикстур, и с какими параметрами, будет вызван для заданной фикстуры.

Бысрый старт

  • Создать класс загрузчика фикстуры
    • В примере неже, загрузчик копирует файл для фикстуры, в заданную дирикторую
    • Для получения данных из фикстуры, рекомендуется применять интерфейсы (в примере это TargetDirInterface)

namespace Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\TestModule1\ResourceLoader;

use Doctrine\Fixture\Fixture;
use Nnx\DoctrineFixtureModule\ResourceLoader\ResourceLoaderInterface;

/**
 * Class MyFixtureResourceLoader
 *
 * @package Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\TestModule1\ResourceLoader
 */
class MyFixtureResourceLoader implements ResourceLoaderInterface
{
    /**
     * Путь до файла с данными
     *
     * @var string
     */
    protected $sourceFile;

    /**
     * @inheritDoc
     */
    public function loadResourceForFixture(Fixture $fixture)
    {
        if ($fixture instanceof TargetDirInterface) {
            $targetDir = $fixture->getTargetDir();

            copy($this->sourceFile, $targetDir . DIRECTORY_SEPARATOR . basename($this->sourceFile));

        }
    }

    /**
     * @return string
     */
    public function getSourceFile()
    {
        return $this->sourceFile;
    }

    /**
     * @param string $sourceFile
     *
     * @return $this
     */
    public function setSourceFile($sourceFile)
    {
        $this->sourceFile = $sourceFile;

        return $this;
    }


}


  • Создать фабрику для загрузчика ресурсов
namespace Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\TestModule1\ResourceLoader;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\MutableCreationOptionsInterface;
use Zend\ServiceManager\MutableCreationOptionsTrait;
use Zend\ServiceManager\ServiceLocatorInterface;

/**
 * Class MyFixtureResourceLoaderFactory
 *
 * @package Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\TestModule1\ResourceLoader
 */
class MyFixtureResourceLoaderFactory implements FactoryInterface, MutableCreationOptionsInterface
{
    use MutableCreationOptionsTrait;

    /**
     * @inheritDoc
     * @throws \Zend\ServiceManager\Exception\ServiceNotFoundException
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $creationOptions = $this->getCreationOptions();
        $sourceFile = $creationOptions['sourceFile'];
        $resourceLoader = new MyFixtureResourceLoader();

        $resourceLoader->setSourceFile($sourceFile);

        return $resourceLoader;
    }

}

  • Зарегестрировать загрузчик ресурсов для фикстур в менеджере плагинов \Nnx\DoctrineFixtureModule\ResourceLoader\ResourceLoaderManagerInterface
    • Проще всего регистрировать через конфиги приложения


use Nnx\DoctrineFixtureModule\ResourceLoader\ResourceLoaderManager;
use Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\TestModule1\ResourceLoader;

return [
    ResourceLoaderManager::CONFIG_KEY => [
        'factories'          => [
            ResourceLoader\MyFixtureResourceLoader::class => ResourceLoader\MyFixtureResourceLoaderFactory::class

        ]
    ],
];


  • Указать для какой фикстуры, необходимо вызывать загрузчик ресуров, а также указать параметры для загрузчика ресурсов

<?php
/**
 * @link    https://github.com/nnx-framework/doctrine-fixture-module
 * @author  Malofeykin Andrey  <and-rey2@yandex.ru>
 */
namespace Nnx\DoctrineFixtureModule;

use Nnx\DoctrineFixtureModule\Module as DoctrineFixtureModule;
use Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\TestModule1\ResourceLoader;

return [
    DoctrineFixtureModule::CONFIG_KEY => [
        'resourceLoader'     => [
            MyFixture::class => [
                'name' => ResourceLoader\MyFixtureResourceLoader::class,
                'options' => [
                    'sourceFile' => __DIR__ . '/../data/sourceFile.xml'
                ]
            ]
        ],

    ]
];

Теперь при запуске фикстуры MyFixture, сначала отработает соответствующий загрузчик фикстур