covex-nn/doctrine-migrations-bundle
Installation Add the bundle to your Symfony project via Composer:
composer require covex-nn/doctrine-migrations-bundle
Enable the bundle in config/bundles.php:
return [
// ...
Covex\DoctrineMigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
];
First Use Case Run migrations to create/update your database schema:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Verify migrations are registered in src/Migrations/ (auto-generated by default).
Where to Look First
config/packages/doctrine_migrations.yaml (if created).src/Migrations/ for custom migrations.Schema Evolution
doctrine:migrations:diff to auto-generate migrations from entity changes.src/Migrations/VersionYYYYMMDDHHMMSS.php:
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
class Version20230101000000 extends AbstractMigration
{
public function up(Schema $schema): void
{
$this->addSql('CREATE TABLE user_preferences (...)');
}
public function down(Schema $schema): void
{
$this->addSql('DROP TABLE user_preferences');
}
}
doctrine:migrations:migrate or doctrine:migrations:execute 'DoctrineMigrations\VersionYYYYMMDDHHMMSS'.Version Control
doctrine:migrations:status to check applied migrations.Integration with CI/CD
# Example GitHub Actions
- name: Run migrations
run: php bin/console doctrine:migrations:migrate --allow-no-migration
Entity-Driven Development
User.php), then generate migrations:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
config/packages/doctrine_migrations.yaml:
doctrine_migrations:
namespace: App\Migrations
directory: '%kernel.project_dir%/src/Migrations'
doctrine:migrations:execute with custom SQL or PHP logic.doctrine:migrations:rollback in staging before production.Namespace Conflicts
App\Migrations) doesn’t clash with the bundle’s default (DoctrineMigrations).namespace in configuration.Auto-Generated Migrations
doctrine:migrations:diff may generate overly complex SQL for large schema changes.Database Locking
--write-sql to preview SQL before execution:
php bin/console doctrine:migrations:execute 'App\Migrations\Version...' --write-sql > migration.sql
Missing Dependencies
doctrine/doctrine-migrations-bundle and doctrine/dbal.composer require doctrine/doctrine-migrations-bundle doctrine/dbal
Configuration Overrides
doctrine_migrations.yaml is misconfigured.--dry-run to test migrations without applying:
php bin/console doctrine:migrations:migrate --dry-run
config/packages/dev/doctrine.yaml:
dbal:
logging: true
profiling: true
doctrine:migrations:status to diagnose stuck migrations.Custom Migration Commands Extend the bundle by creating custom commands (e.g., for data migrations):
// src/Command/CustomMigrationCommand.php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class CustomMigrationCommand extends Command
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
// Custom logic (e.g., call doctrine:migrations:migrate + data updates)
return Command::SUCCESS;
}
}
Register in src/Kernel.php:
protected function registerCommands(): void
{
$this->commands = [
// ...
new \App\Command\CustomMigrationCommand(),
];
}
Event Listeners
Hook into migration events (e.g., postGenerateMigration) to modify behavior:
// src/EventListener/MigrationListener.php
namespace App\EventListener;
use Doctrine\Migrations\Event\PostGenerateMigrationEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MigrationListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
PostGenerateMigrationEvent::NAME => 'onPostGenerateMigration',
];
}
public function onPostGenerateMigration(PostGenerateMigrationEvent $event): void
{
$migration = $event->getMigration();
// Modify $migration->up() or $migration->down() logic
}
}
Register in services.yaml:
services:
App\EventListener\MigrationListener:
tags: ['doctrine_migrations.event_subscriber']
Database-Specific Quirks
addSql() for database-agnostic migrations or conditional logic:
public function up(Schema $schema): void
{
if ($this->connection->getDatabasePlatform()->getName() === 'postgresql') {
$this->addSql('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"');
}
}
How can I help you explore Laravel packages today?