Фикстуры. 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')>]

На этом все, для более глубокого рассмотрения ознакомьтесь с документацией.