sylius-labs/doctrine-migrations-extra-bundle
Symfony bundle extending DoctrineMigrationsBundle with container-aware migration instantiation and topological sorting of migrations across multiple namespaces/bundles. Configure migration dependencies to ensure predictable, correct execution order in apps or bundles.
composer require sylius-labs/doctrine-migrations-extra-bundle
config/bundles.php:
SyliusLabs\DoctrineMigrationsExtraBundle\SyliusLabsDoctrineMigrationsExtraBundle::class => ['all' => true],
config/packages/doctrine_migrations.yaml:
doctrine_migrations:
services:
'Doctrine\Migrations\Version\MigrationFactory': 'SyliusLabs\DoctrineMigrationsExtraBundle\Factory\ContainerAwareVersionFactory'
'Doctrine\Migrations\Version\Comparator': 'SyliusLabs\DoctrineMigrationsExtraBundle\Comparator\TopologicalVersionComparator'
Define migration dependencies in config/packages/sylius_labs_doctrine_migrations_extra.yaml:
sylius_labs_doctrine_migrations_extra:
migrations:
'Core\Migrations': ~
'Plugin\Migrations': ['Core\Migrations']
Run migrations with:
php bin/console doctrine:migrations:migrate
sylius_labs_doctrine_migrations_extra.yaml:
migrations:
'Bundle1\Migrations': ['Bundle2\Migrations']
'Bundle2\Migrations': ~
php bin/console doctrine:migrations:diff --namespace=Bundle1\Migrations
php bin/console doctrine:migrations:migrate
Extension class:
public function prepend(ContainerBuilder $container): void {
$container->prependExtensionConfig('sylius_labs_doctrine_migrations_extra', [
'migrations' => [
'Acme\Migrations' => ['Core\Migrations']
]
]);
}
doctrine_migrations.yaml:
doctrine_migrations:
migrations_paths:
'Acme\Migrations': '@AcmeBundle/Migrations'
%kernel.environment% to conditionally define dependencies:
sylius_labs_doctrine_migrations_extra:
migrations:
'App\Migrations': ~
'Plugin\Migrations': ['App\Migrations'] # Always depends on core
config/packages/dev/sylius_labs_doctrine_migrations_extra.yaml:
migrations:
'Plugin\Migrations': ['App\Migrations', 'DevPlugin\Migrations']
Circular Dependencies:
CircularDependencyException if dependencies form a loop.Namespace Conflicts:
Vendor\Bundle\Migrations).--namespace with doctrine:migrations:diff to avoid clashes.Cache Invalidation:
php bin/console cache:clear
php bin/console debug:container SyliusLabs\DoctrineMigrationsExtraBundle\Comparator\TopologicalVersionComparator
TopologicalVersionComparator service for dependency graphs.Custom Comparator:
Extend TopologicalVersionComparator to add logic (e.g., version-based sorting):
class CustomComparator extends TopologicalVersionComparator {
protected function getDependencies(Migration $migration): array {
// Custom logic here
}
}
Register it in doctrine_migrations.yaml:
services:
'Doctrine\Migrations\Version\Comparator': 'App\CustomComparator'
Dynamic Dependencies:
Use the ContainerAwareVersionFactory to inject services into migrations:
public function up(Schema $schema, Migration $migration) {
$this->container->get('service')->doSomething();
}
Comparator.How can I help you explore Laravel packages today?