Подключаем DoctrineMigrationsBundle и DoctrineFixturesBundle к проекту на Symfony2

UPD. После релиза Symfony2 некоторые вещи описанные в этой заметке изменились. Советую читать офф. документацию по работе с DoctrineMigrationsBundle и DoctrineFixturesBundle.

DoctrineMigrationsBundle и DoctrineFixturesBundle необходимы для работы с миграциями и фикстурами Doctrine2 посредством консоли Symfony2. Изначально они были в основном репозитории Symfony2, но недавно их оттуда убрали.

Как подключить?

Для подтягивания кода сторонних либ к проекту я использую скрипт bin/vendors.sh (по аналогии с скриптом из symfony-standard).

В этом скрипте, за инициализацию и апдейт вышеперечисленных либ/бандлов отвечают следующие строки:

# Doctrine Migrations
install_git doctrine-migrations http://github.com/doctrine/migrations.git
 
# Doctrine Data Fixtures Extension
install_git doctrine-data-fixtures http://github.com/doctrine/data-fixtures.git
 
# DoctrineFixturesBundle
mkdir -p $VENDOR/symfony/src/Symfony/Bundle/
cd $VENDOR/symfony/src/Symfony/Bundle/
install_git DoctrineFixturesBundle http://github.com/symfony/DoctrineFixturesBundle.git
 
# DoctrineMigrationsBundle
mkdir -p $VENDOR/symfony/src/Symfony/Bundle/
cd $VENDOR/symfony/src/Symfony/Bundle/
install_git DoctrineMigrationsBundle https://github.com/symfony/DoctrineMigrationsBundle.git

Т.к. бандлы разворачиваются непосредственно в директорию $VENDOR/symfony/src/Symfony/Bundle/, то в скрипте app/autoload.php не нужно дополнительно ничего прописывать. Достаточно существующего неймспейса для Symfony:

<?php
 
use Symfony\Component\ClassLoader\UniversalClassLoader;
 
$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    'Symfony'                        => __DIR__.'/../vendor/symfony/src',
    // ...
));

Дальше регистрирую бандлы в app/AppKernel.php:

<?php
 
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
 
class AppKernel extends Kernel
{
 
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new Symfony\Bundle\DoctrineFixturesBundle\DoctrineFixturesBundle(),
            new Symfony\Bundle\DoctrineMigrationsBundle\DoctrineMigrationsBundle(),
            // ...
        );
 
        return $bundles;
    }
 
    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}

Для DoctrineMigrationsBundle нужно ещё указать путь к файлам миграции в конфиге app/config/config.yml:

 
# DoctrineMigrationsBundle
doctrine_migrations:
    dir_name: %kernel.root_dir%/DoctrineMigrations

В принципе все.

Как работает?

При запуске скрипта консоли ./app/console, в меню должны появиться новые пункты:

doctrine:fixtures
  :load                        Load data fixtures to your database.
doctrine:migrations
  :diff                        Generate a migration by comparing your current database to your mapping information.
  :execute                     Execute a single migration version up or down manually.
  :generate                    Generate a blank migration class.
  :migrate                     Execute a migration to a specified version or the latest available version.
  :status                      View the status of a set of migrations.
  :version                     Manually add and delete migration versions from the version table.

Чтобы увидеть справку по отдельной команде нужно перед командой набрать help. Например справка по “doctrine:fixtures:load”:

 
$ ./console help doctrine:fixtures:load
Usage:
 doctrine:fixtures:load [--fixtures[="..."]] [--append] [--em="..."]
 
Options:
 --fixtures The directory or file to load data fixtures from. (multiple values allowed)
 --append Append the data fixtures instead of flushing the database first.
 --em The entity manager to use for this command.
 
Help:
 The doctrine:fixtures:load command loads data fixtures from your bundles:
 
   ./app/console doctrine:fixtures:load
 
 You can also optionally specify the path to fixtures with the --fixtures option:
 
   ./app/console doctrine:fixtures:load --fixtures=/path/to/fixtures1 --fixtures=/path/to/fixtures2
 
 If you want to append the fixtures instead of flushing the database first you can use the --append option:
 
   ./app/console doctrine:fixtures:load --append

PS. Я написал эту заметку за полчаса до поезда и не хотел углубляться в детали. Если есть вопросы, тогда задавайте их в комментариях.

PS2. Заметка о миграциях в офф. документации.

14 thoughts on “Подключаем DoctrineMigrationsBundle и DoctrineFixturesBundle к проекту на Symfony2

  1. Отличная заметка, сложностей не возникло, все просто и понятно. Симфони радует.

  2. Степан, питання не по Symfony. Хочу почати вивчати якийсь фреймворк, але не знаю який краще. Часу толком немає щоб розгулювати по різних тому хочу не прогадати. Можливо зенд? Порадьте, можливо ще якусь літературу. Буду вдячний!

  3. Не пойму..
    Fatal error: Class ‘Doctrine\DBAL\Migrations\Tools\Console\Command\StatusCommand’ not found in /var/www/solid/vendor/symfony/src/Symfony/Bundle/DoctrineMigrationsBundle/Command/MigrationsStatusDoctrineCommand.php on line 27

    • Спробуйте додати в app/autoloader.php

          'DoctrineCommonDataFixtures' => __DIR__.'/../vendor/doctrine-data-fixtures/lib',
          'DoctrineDBALMigrations'     => __DIR__.'/../vendor/doctrine-migrations/lib',

      забув про це написати

        • Хоча ні. Не допомогло. Не працює.
          “Fatal error: Class ‘Symfony\Bundle\DoctrineBundle\Command\Proxy\DoctrineCommandHelper’ not found in /var/www/solid/vendor/symfony/src/Symfony/Bundle/DoctrineMigrationsBundle/Command/MigrationsDiffDoctrineCommand.php on line 41

          Я не можу збагнути в чому проблема. Чому не видно цього DoctrineCommandHelper з MigrationsDiffDoctrineCommand

          А Ви не забули написати, а написали:
          “Т.к. бандлы разворачиваются непосредственно в директорию $VENDOR/symfony/src/Symfony/Bundle/, то в скрипте app/autoload.php не нужно дополнительно ничего прописывать. Достаточно существующего неймспейса для Symfony”

          • написав. для бандлів не потрібно прописувати, а для ліб — потрібно.

            цей файл йде в стандартному наборі бандлів symfony2

            подивіться як в мене на проекті підключені ці бандли
            можливо ми ще щось упустили

Leave a Reply

Your email address will not be published. Required fields are marked *