Загрузчики фикстур
Загрузчик фикстур - класс имплементирующий \Doctrine\Fixture\Loader\Loader , позволяющий загрузить одну или несколько фикстур.
Для работы с загрузчиками фикстур используется специальный менеджер плагинов - \Nnx\DoctrineFixtureModule\Loader\FixtureLoaderManagerInterface. Пример получения загрузчика фикстур в фабрике:
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Nnx\DoctrineFixtureModule\Loader\FixtureLoaderManagerInterface;
use Doctrine\Fixture\Loader\ClassLoader;
class ExecutorFactory implements FactoryInterface
{
/**
* @inheritDoc
*
* @throws \Zend\ServiceManager\Exception\ServiceNotFoundException
* @throws \Nnx\DoctrineFixtureModule\Executor\Exception\RuntimeException
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
/** @var FixtureLoaderManagerInterface $fixtureLoaderManager */
$fixtureLoaderManager = $serviceLocator->get(FixtureLoaderManagerInterface::class);
$fixtureLoader = $fixtureLoaderManager->get(ClassLoader::class);
}
}
Модуль doctrine/data-fixtures предоставляет следующие загрузчики фикстур:
Загрузчик | Описание |
---|---|
\Doctrine\Fixture\Loader\ChainLoader | Позволяет объединить загрузчики фикстур в цепочку |
\Doctrine\Fixture\Loader\ClassLoader | Загрузка списка классов фикстур |
\Doctrine\Fixture\Loader\DirectoryLoader | Загружает все фикстуры из заданной директории |
\Doctrine\Fixture\Loader\GlobLoader | Загружает все фикстуры из заданной директории, в качестве средства получения файлов из директории используется \GlobIterator |
\Doctrine\Fixture\Loader\RecursiveDirectoryLoader | Загружает все фикстуры из заданной директории, используя рекурсивный обход вложенных каталогов |
Каждый из этих загрузчиков фикстур зарегестрирован в менеджере плагинов \Nnx\DoctrineFixtureModule\Loader\FixtureLoaderManagerInterface.
Загрузчик \Doctrine\Fixture\Loader\ChainLoader
Объединяет загрузчики фикстур в цепочку.
Пример использования:
/** @var FixtureLoaderManagerInterface $loaderManager */
$loaderManager = $this->getApplicationServiceLocator()->get(FixtureLoaderManagerInterface::class);
$options = [
'loaderList' => [
$loaderManager->get(\Doctrine\Fixture\Loader\ClassLoader::class, [
'classList' => [
\Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\FixturesDir\FooFixture::class
]
]),
$loaderManager->get(\Doctrine\Fixture\Loader\ClassLoader::class, [
'classList' => [
\Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\FixturesDir\BarFixture::class
]
])
]
];
/** @var \Doctrine\Fixture\Fixture[] $fixtures */
$fixtures = $loaderManager->get(\Doctrine\Fixture\Loader\ChainLoader::class, $options)->load();
При создание экземпляра загрузчика фикстур \Doctrine\Fixture\Loader\ChainLoader через плагин менеджер, в опциях с помощью параметра loaderList, можно указать массив объектов загрузчиков фикстур.
После вызова метода load у экземпляра объекта \Doctrine\Fixture\Loader\ChainLoader, будут загружены все фикстуры из загрузчиков, образующих цепочку
Загрузчик \Doctrine\Fixture\Loader\ClassLoader
Позволяет загрузить фикстуры на основе списка переданных классов фикстур.
Пример использования:
/** @var FixtureLoaderManagerInterface $loaderManager */
$loaderManager = $this->getApplicationServiceLocator()->get(FixtureLoaderManagerInterface::class);
$options = [
'classList' => [
\Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\TestModule1\FooFixture::class,
\Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\TestModule1\BarFixture::class,
]
];
/** @var \Doctrine\Fixture\Fixture[] $fixtures */
$fixtures = $loaderManager->get(\Doctrine\Fixture\Loader\ClassLoader::class, $options)->load();
При создание экземпляра загрузчика фикстур \Doctrine\Fixture\Loader\ClassLoader через плагин менеджер, в опциях с помощью параметра classList, можно указать массив с именами классов фикстур.
После вызова метода load у экземпляра объекта \Doctrine\Fixture\Loader\ClassLoader, будут загружены все фикстуры перечисленные в classList.
Загрузчик \Doctrine\Fixture\Loader\DirectoryLoader
Позволяет загрузить фикстуры из заданной директории
Пример использования:
/** @var FixtureLoaderManagerInterface $loaderManager */
$loaderManager = $this->getApplicationServiceLocator()->get(FixtureLoaderManagerInterface::class);
$options = [
'directory' => __DIR__ . '/../../fixture/'
];
/** @var \Doctrine\Fixture\Fixture[] $fixtures */
$fixtures = $loaderManager->get(\Doctrine\Fixture\Loader\DirectoryLoader::class, $options)->load();
При создание экземпляра загрузчика фикстур \Doctrine\Fixture\Loader\DirectoryLoader через плагин менеджер, в опциях с помощью параметра directory, указывается директория, в которой располагаются файлы с фикстурами.
После вызова метода load у экземпляра объекта \Doctrine\Fixture\Loader\DirectoryLoader, будут загружены все фикстуры найденные в файлах расположенных в директории указанной в параметре directory.
Загрузчик \Doctrine\Fixture\Loader\GlobLoader
Позволяет загрузить фикстуры из заданной директории. Загрузка производится с помощью GlobIterator
Пример использования:
/** @var FixtureLoaderManagerInterface $loaderManager */
$loaderManager = $this->getApplicationServiceLocator()->get(FixtureLoaderManagerInterface::class);
$options = [
'directory' => __DIR__ . '/../../fixture/'
];
/** @var \Doctrine\Fixture\Fixture[] $fixtures */
$fixtures = $loaderManager->get(\Doctrine\Fixture\Loader\DirectoryLoader::class, $options)->load();
При создание экземпляра загрузчика фикстур \Doctrine\Fixture\Loader\DirectoryLoader через плагин менеджер, в опциях с помощью параметра directory, указывается директория, в которой располагаются файлы с фикстурами.
После вызова метода load у экземпляра объекта \Doctrine\Fixture\Loader\DirectoryLoader, будут загружены все фикстуры найденные в файлах расположенных в директории указанной в параметре directory.
Загрузчик \Doctrine\Fixture\Loader\RecursiveDirectoryLoader
Позволяет загрузить фикстуры из заданной директории. При этом рекурсивно обходятся вложенные каталоги. Загрузка происходит с помощью RecursiveDirectoryIterator
Пример использования:
/** @var FixtureLoaderManagerInterface $loaderManager */
$loaderManager = $this->getApplicationServiceLocator()->get(FixtureLoaderManagerInterface::class);
$options = [
'directory' => __DIR__ . '/../../fixture/'
];
/** @var \Doctrine\Fixture\Fixture[] $fixtures */
$fixtures = $loaderManager->get(\Doctrine\Fixture\Loader\RecursiveDirectoryLoader::class, $options)->load();
При создание экземпляра загрузчика фикстур \Doctrine\Fixture\Loader\RecursiveDirectoryLoader через плагин менеджер, в опциях с помощью параметра directory, указывается директория, в которой располагаются файлы с фикстурами.
После вызова метода load у экземпляра объекта \Doctrine\Fixture\Loader\RecursiveDirectoryLoader, будут загружены все фикстуры найденные в файлах и вложенных подкаталогах в директории указанной в параметре directory.
Создание загрузчиков с помощью конфигов приложения
Для упрощения работы с загрузчиками, их можно описать в конфиге приложения.
В секции nnx_doctrine_fixture_module в разделе fixturesLoaders описываются используемые загрузчики фикстур. В качестве ключа в fixturesLoaders указывается условное имя для загрузчика, а в качестве значения массив, каждый элемент которого описывает отдельный загрузчик фикстур. Для каждого элемента в разделе fixturesLoaders, создается загрузчик \Doctrine\Fixture\Loader\ChainLoader и в него добавляются все описанные элементы.
use Doctrine\Fixture\Loader\ClassLoader;
return [
'nnx_doctrine_fixture_module' => [
// В секции fixturesLoaders описываются загрузчики фикстур
'fixturesLoaders' => [
//Имя цепочки загрузчиков фикстур.
'test' => [
//Имя загрузчика фикстур. Может быть произвольным. Нужно только для возможности переопределить конфиг в другом модуле
'kladr' => [
//Плагин из \Nnx\DoctrineFixtureModule\Loader\FixtureLoaderManagerInterface
'name' => ClassLoader::class,
//Настройки для загрузчика фикстур
'options' => [
'classList' => [
TestModule1\FooFixture::class,
]
]
],
//Имя загрузчика фикстур. Может быть произвольным. Нужно только для возможности переопределить конфиг в другом модуле
'okpd' => [
//Плагин из \Nnx\DoctrineFixtureModule\Loader\FixtureLoaderManagerInterface
'name' => ClassLoader::class,
//Настройки для загрузчика фикстур
'options' => [
'classList' => [
TestModule1\BarFixture::class,
]
]
]
]
]
]
];
В приведенном выше примере, создается загрузчик фикстур 'test'. Это загрузчик \Doctrine\Fixture\Loader\ChainLoader. В него добавляются два загрузчика фикстур Doctrine\Fixture\Loader\ClassLoader. Имена kladr и okpd, произвольные. Эти имена не являются обязательными, и служат лишь для того, что бы оставить возможность перенастроить фикстуры в другом модуле.
Также можно указывать имена фикстур зарегестрированных в секции fixturesLoaders. Например:
use Doctrine\Fixture\Loader\ClassLoader;
use Nnx\DoctrineFixtureModule\PhpUnit\TestData\FixtureTestApp\TestModule1;
return [
'nnx_doctrine_fixture_module' => [
// В секции fixturesLoaders описываются загрузчики фикстур
'fixturesLoaders' => [
//Имя цепочки загрузчиков фикстур.
'test' => [
//Имя загрузчика фикстур. Может быть произвольным. Нужно только для возможности переопределить конфиг в другом модуле
'kladr' => [
//Плагин из \Nnx\DoctrineFixtureModule\Loader\FixtureLoaderManagerInterface
'name' => ClassLoader::class,
//Настройки для загрузчика фикстур
'options' => [
'classList' => [
TestModule1\FooFixture::class,
]
]
],
//Имя загрузчика фикстур. Может быть произвольным. Нужно только для возможности переопределить конфиг в другом модуле
'childFixtureLoader' => [
//Указывается загрузчик фикстур зарегистрированный в fixturesLoaders
'name' => 'testChild',
]
],
//Имя цепочки загрузчиков фикстур.
'testChild' => [
'testItem' => [
//Плагин из \Nnx\DoctrineFixtureModule\Loader\FixtureLoaderManagerInterface
'name' => ClassLoader::class,
//Настройки для загрузчика фикстур
'options' => [
'classList' => [
TestModule1\BarFixture::class,
]
]
],
]
]
]
];