Фикстуры. AliceBundle
В предыдущей заметке мы познакомились с фикстурами в Symfony framework, а также с DoctrineFixturesBundle. Хотелось бы сделать обзор еще одного полезного бандла для работы с фикстурами - AliceBundle (обертка вокруг компонента alice).
Из вкусненького:
- Возможность загружать данные с .yml
- Поддержка референсов
- Вызов внешних методов
- Использует DoctrineFixturesBundle (поэтому, после танцев, можно использовать общие данные)
- Теоретически, можно использовать не только для загрузки фикстур, а й для данных (можно считать с файла, воссоздать все референсы, а потом уже загрузить)
- Генерация данных (можно, например, сгенерить пользователей user0..user1)
Из явных недостатков:
- Нету возможности шарить референсы с DoctrineFixturesBundle (но с бубном можно ;))
- Вызов метода вроде <getReference('user@mail.com')> вызовет неожиданные проблемы (об этом чуть позже)
Установка:
composer require hautelook/alice-bundle
По зависимостях установится и DoctrineFixturesBundle. Регистрируем бандлы в app/AppKernel.php:
<?php
// app/AppKernel.php
public function registerBundles() { $bundles = array( // ... if (in_array($this->getEnvironment(), array('dev', 'test'))) { new DoctrineBundleFixturesBundleDoctrineFixturesBundle(), new HautelookAliceBundleHautelookAliceBundle(), } // ... ); }
Использование
У файле фикстуры (например, ..DataFixturesORMLoadData.php)
<?php
namespace AcmeDemoBundleDataFixturesORM;
use HautelookAliceBundleAliceDataFixtureLoader;
class LoadData extends DataFixtureLoader { /** * {@inheritDoc} */ protected function getFixtures() { return array( __DIR__ . '/data.yml',
); } }
В самом data.yml:
VendorBundleTestBundleEntityUser:
user0:
username: user
plainPassword: 1111
user1:
username: other_user
plainPassword: 1111
VendorBundleTestBundleEntityGroup: name: super_users users: [@user0, @user1]
Таким образом, загружаем пользователей и группу, причем @user0, @user1 - референсы на пользователей, описанных в фикстурах. Так же можно вызывать методы:
VendorBundleTestBundleEntityGroup:
name: super_users
users: [<getUser('user0')>, <getUser('user1')>]
Метод должен быть описан в классе загрузки фикстур (LoadData в нашем примере). Таким образом и можно получить референсы на данные, загруженные с помощью DoctrineFixturesBundle. Пример реализации: https://gist.github.com/harentius/798a997ae4106719448b
Для получения референсов, лоадер нужно наследовать от класса BaseDataFixtureLoader (большую часть кода я взял у DoctrineFixturesBundle) и у yml файле использовать метод getReference:
.....
users: [<getReference('user0')>, <getReference('user1')>]
На этом все, для более глубокого рассмотрения ознакомьтесь с документацией.