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. Я написал эту заметку за полчаса до поезда и не хотел углубляться в детали. Если есть вопросы, тогда задавайте их в комментариях.
Отличная заметка, сложностей не возникло, все просто и понятно. Симфони радует.
Рад что пригодилось ;).
Степан, питання не по Symfony. Хочу почати вивчати якийсь фреймворк, але не знаю який краще. Часу толком немає щоб розгулювати по різних тому хочу не прогадати. Можливо зенд? Порадьте, можливо ще якусь літературу. Буду вдячний!
Symfony2/ZF.
По зф я читав мануал + статті + форум
Дякую, будем працювати))По ZF ще книги ніби непогані є, як ці?
http://zendframework.ru/links/books
“Zend Framework in Action” можна почитати, інші я хіба проглядав.
Ок, фронт роботи на літо вже собі намалював. Дякую за поради.
Не пойму..
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
забув про це написати
О! Дякую. Варто також зауважити, що це потрібно додавати _перед_ Doctrine\\Common та Doctrine\\DBAL
Хоча ні. Не допомогло. Не працює.
“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
подивіться як в мене на проекті підключені ці бандли
можливо ми ще щось упустили
Поправь пожалуйста ссылку на документацию:
http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html
оновив. дякую 😉