Merge remote-tracking branch 'origin/3.5.x' into 4.0.x

This commit is contained in:
Grégoire Paris
2025-10-12 20:26:20 +02:00
13 changed files with 204 additions and 166 deletions

View File

@@ -12,4 +12,4 @@ on:
jobs:
coding-standards:
name: "Coding Standards"
uses: "doctrine/.github/.github/workflows/coding-standards.yml@7.1.0"
uses: "doctrine/.github/.github/workflows/coding-standards.yml@8.0.0"

View File

@@ -17,4 +17,4 @@ on:
jobs:
composer-lint:
name: "Composer Lint"
uses: "doctrine/.github/.github/workflows/composer-lint.yml@7.1.0"
uses: "doctrine/.github/.github/workflows/composer-lint.yml@8.0.0"

View File

@@ -12,7 +12,7 @@ on:
jobs:
phpunit:
name: "PHPUnit"
uses: "doctrine/.github/.github/workflows/continuous-integration.yml@7.1.0"
uses: "doctrine/.github/.github/workflows/continuous-integration.yml@8.0.0"
with:
php-versions: '["8.4"]'
secrets:
@@ -20,7 +20,7 @@ jobs:
phpunit-with-dev-deps:
name: "PHPUnit with dev dependencies"
uses: "doctrine/.github/.github/workflows/continuous-integration-symfony-unstable.yml@7.1.0"
uses: "doctrine/.github/.github/workflows/continuous-integration-symfony-unstable.yml@8.0.0"
with:
symfony-version-constraint: "^7"
secrets:

View File

@@ -8,7 +8,7 @@ on:
jobs:
release:
name: "Git tag, release & create merge-up PR"
uses: "doctrine/.github/.github/workflows/release-on-milestone-closed.yml@7.1.0"
uses: "doctrine/.github/.github/workflows/release-on-milestone-closed.yml@8.0.0"
secrets:
GIT_AUTHOR_EMAIL: ${{ secrets.GIT_AUTHOR_EMAIL }}
GIT_AUTHOR_NAME: ${{ secrets.GIT_AUTHOR_NAME }}

View File

@@ -12,4 +12,4 @@ on:
jobs:
static-analysis:
name: "Static Analysis"
uses: "doctrine/.github/.github/workflows/phpstan.yml@7.1.0"
uses: "doctrine/.github/.github/workflows/phpstan.yml@8.0.0"

View File

@@ -23,6 +23,14 @@ might have to adjust your own code to abide by the new type declarations.
* Migrations that implement `ContainerAwareInterface` will no longer have the container injected automatically.
* The `ContainerAwareMigrationFactory` class has been removed.
## Upgrade to 3.5
## Final classes
Some classes have been marked as `@final` because they are not supposed to be
extended. They will be `final`, and most of them will be marked with
`@internal` in 4.0.0.
## From 2.x to 3.0.0
- The configuration for the migration namespace and directory changed as follows:

View File

@@ -32,7 +32,7 @@
},
"require-dev": {
"composer/semver": "^3.0",
"doctrine/coding-standard": "^12",
"doctrine/coding-standard": "^14",
"doctrine/orm": "^3",
"phpstan/phpstan": "^2",
"phpstan/phpstan-deprecation-rules": "^2",

161
config/services.php Normal file
View File

@@ -0,0 +1,161 @@
<?php
declare(strict_types=1);
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
use Doctrine\Bundle\MigrationsBundle\EventListener\SchemaFilterListener;
use Doctrine\Bundle\MigrationsBundle\MigrationsFactory\ContainerAwareMigrationFactory;
use Doctrine\Migrations\Configuration\Configuration;
use Doctrine\Migrations\Configuration\Connection\ConnectionRegistryConnection;
use Doctrine\Migrations\Configuration\Connection\ExistingConnection;
use Doctrine\Migrations\Configuration\EntityManager\ExistingEntityManager;
use Doctrine\Migrations\Configuration\EntityManager\ManagerRegistryEntityManager;
use Doctrine\Migrations\Configuration\Migration\ExistingConfiguration;
use Doctrine\Migrations\DependencyFactory;
use Doctrine\Migrations\Tools\Console\Command\CurrentCommand;
use Doctrine\Migrations\Tools\Console\Command\DiffCommand;
use Doctrine\Migrations\Tools\Console\Command\DumpSchemaCommand;
use Doctrine\Migrations\Tools\Console\Command\ExecuteCommand;
use Doctrine\Migrations\Tools\Console\Command\GenerateCommand;
use Doctrine\Migrations\Tools\Console\Command\LatestCommand;
use Doctrine\Migrations\Tools\Console\Command\ListCommand;
use Doctrine\Migrations\Tools\Console\Command\MigrateCommand;
use Doctrine\Migrations\Tools\Console\Command\RollupCommand;
use Doctrine\Migrations\Tools\Console\Command\StatusCommand;
use Doctrine\Migrations\Tools\Console\Command\SyncMetadataCommand;
use Doctrine\Migrations\Tools\Console\Command\UpToDateCommand;
use Doctrine\Migrations\Tools\Console\Command\VersionCommand;
use Doctrine\Migrations\Version\MigrationFactory;
return static function (ContainerConfigurator $container) {
$container->services()
->set('doctrine.migrations.dependency_factory', DependencyFactory::class)
->args([
service('doctrine.migrations.configuration_loader'),
abstract_arg('loader service'),
service('logger')->nullOnInvalid(),
])
->set('doctrine.migrations.configuration_loader', ExistingConfiguration::class)
->args([service('doctrine.migrations.configuration')])
->set('doctrine.migrations.connection_loader', ExistingConnection::class)
->set('doctrine.migrations.em_loader', ExistingEntityManager::class)
->set('doctrine.migrations.entity_manager_registry_loader', ManagerRegistryEntityManager::class)
->args([service('doctrine')])
->factory([ManagerRegistryEntityManager::class, 'withSimpleDefault'])
->set('doctrine.migrations.connection_registry_loader', ConnectionRegistryConnection::class)
->args([service('doctrine')])
->factory([ConnectionRegistryConnection::class, 'withSimpleDefault'])
->set('doctrine.migrations.configuration', Configuration::class)
->set('doctrine.migrations.migrations_factory', MigrationFactory::class)
->factory([service('doctrine.migrations.dependency_factory'), 'getMigrationFactory'])
->set('doctrine.migrations.container_aware_migrations_factory', ContainerAwareMigrationFactory::class)
->decorate('doctrine.migrations.migrations_factory')
->args([
service('doctrine.migrations.container_aware_migrations_factory.inner'),
service('service_container'),
])
->set('doctrine_migrations.diff_command', DiffCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:diff',
])
->tag('console.command', ['command' => 'doctrine:migrations:diff'])
->set('doctrine_migrations.sync_metadata_command', SyncMetadataCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:sync-metadata-storage',
])
->tag('console.command', ['command' => 'doctrine:migrations:sync-metadata-storage'])
->set('doctrine_migrations.versions_command', ListCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:versions',
])
->tag('console.command', ['command' => 'doctrine:migrations:list'])
->set('doctrine_migrations.current_command', CurrentCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:current',
])
->tag('console.command', ['command' => 'doctrine:migrations:current'])
->set('doctrine_migrations.dump_schema_command', DumpSchemaCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:dump-schema',
])
->tag('console.command', ['command' => 'doctrine:migrations:dump-schema'])
->set('doctrine_migrations.execute_command', ExecuteCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:execute',
])
->tag('console.command', ['command' => 'doctrine:migrations:execute'])
->set('doctrine_migrations.generate_command', GenerateCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:generate',
])
->tag('console.command', ['command' => 'doctrine:migrations:generate'])
->set('doctrine_migrations.latest_command', LatestCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:latest',
])
->tag('console.command', ['command' => 'doctrine:migrations:latest'])
->set('doctrine_migrations.migrate_command', MigrateCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:migrate',
])
->tag('console.command', ['command' => 'doctrine:migrations:migrate'])
->set('doctrine_migrations.rollup_command', RollupCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:rollup',
])
->tag('console.command', ['command' => 'doctrine:migrations:rollup'])
->set('doctrine_migrations.status_command', StatusCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:status',
])
->tag('console.command', ['command' => 'doctrine:migrations:status'])
->set('doctrine_migrations.up_to_date_command', UpToDateCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:up-to-date',
])
->tag('console.command', ['command' => 'doctrine:migrations:up-to-date'])
->set('doctrine_migrations.version_command', VersionCommand::class)
->args([
service('doctrine.migrations.dependency_factory'),
'doctrine:migrations:version',
])
->tag('console.command', ['command' => 'doctrine:migrations:version'])
->set('doctrine_migrations.schema_filter_listener', SchemaFilterListener::class)
// The "doctrine.dbal.schema_filter" tag is dynamically added for each connection
->tag('kernel.event_listener', ['event' => 'console.command', 'method' => 'onConsoleCommand']);
};

View File

@@ -1,148 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="doctrine.migrations.dependency_factory" class="Doctrine\Migrations\DependencyFactory" public="false">
<factory></factory>
<argument type="service" id="doctrine.migrations.configuration_loader"/>
<argument></argument>
<argument type="service" id="logger" on-invalid="null"></argument>
</service>
<service id="doctrine.migrations.configuration_loader" class="Doctrine\Migrations\Configuration\Migration\ExistingConfiguration" public="false">
<argument type="service" id="doctrine.migrations.configuration"/>
</service>
<service id="doctrine.migrations.connection_loader" class="Doctrine\Migrations\Configuration\Connection\ExistingConnection" public="false">
</service>
<service id="doctrine.migrations.em_loader" class="Doctrine\Migrations\Configuration\EntityManager\ExistingEntityManager" public="false">
</service>
<service id="doctrine.migrations.entity_manager_registry_loader" class="Doctrine\Migrations\Configuration\EntityManager\ManagerRegistryEntityManager" public="false">
<factory class="Doctrine\Migrations\Configuration\EntityManager\ManagerRegistryEntityManager" method="withSimpleDefault"/>
<argument type="service" id="doctrine"/>
</service>
<service id="doctrine.migrations.connection_registry_loader" class="Doctrine\Migrations\Configuration\Connection\ConnectionRegistryConnection" public="false">
<factory class="Doctrine\Migrations\Configuration\Connection\ConnectionRegistryConnection" method="withSimpleDefault"/>
<argument type="service" id="doctrine"/>
</service>
<service id="doctrine.migrations.configuration" class="Doctrine\Migrations\Configuration\Configuration" public="false">
</service>
<service id="doctrine.migrations.migrations_factory" class="Doctrine\Migrations\Version\MigrationFactory">
<factory service="doctrine.migrations.dependency_factory" method="getMigrationFactory"/>
</service>
<service id="doctrine_migrations.diff_command" class="Doctrine\Migrations\Tools\Console\Command\DiffCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:diff</argument>
<tag name="console.command" command="doctrine:migrations:diff" />
</service>
<service id="doctrine_migrations.sync_metadata_command" class="Doctrine\Migrations\Tools\Console\Command\SyncMetadataCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:sync-metadata-storage</argument>
<tag name="console.command" command="doctrine:migrations:sync-metadata-storage" />
</service>
<service id="doctrine_migrations.versions_command" class="Doctrine\Migrations\Tools\Console\Command\ListCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:versions</argument>
<tag name="console.command" command="doctrine:migrations:list" />
</service>
<service id="doctrine_migrations.current_command" class="Doctrine\Migrations\Tools\Console\Command\CurrentCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:current</argument>
<tag name="console.command" command="doctrine:migrations:current"/>
</service>
<service id="doctrine_migrations.dump_schema_command" class="Doctrine\Migrations\Tools\Console\Command\DumpSchemaCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:dump-schema</argument>
<tag name="console.command" command="doctrine:migrations:dump-schema"/>
</service>
<service id="doctrine_migrations.execute_command" class="Doctrine\Migrations\Tools\Console\Command\ExecuteCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:execute</argument>
<tag name="console.command" command="doctrine:migrations:execute"/>
</service>
<service id="doctrine_migrations.generate_command" class="Doctrine\Migrations\Tools\Console\Command\GenerateCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:generate</argument>
<tag name="console.command" command="doctrine:migrations:generate"/>
</service>
<service id="doctrine_migrations.latest_command" class="Doctrine\Migrations\Tools\Console\Command\LatestCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:latest</argument>
<tag name="console.command" command="doctrine:migrations:latest"/>
</service>
<service id="doctrine_migrations.migrate_command" class="Doctrine\Migrations\Tools\Console\Command\MigrateCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:migrate</argument>
<tag name="console.command" command="doctrine:migrations:migrate" />
</service>
<service id="doctrine_migrations.rollup_command" class="Doctrine\Migrations\Tools\Console\Command\RollupCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:rollup</argument>
<tag name="console.command" command="doctrine:migrations:rollup" />
</service>
<service id="doctrine_migrations.status_command" class="Doctrine\Migrations\Tools\Console\Command\StatusCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:status</argument>
<tag name="console.command" command="doctrine:migrations:status" />
</service>
<service id="doctrine_migrations.up_to_date_command" class="Doctrine\Migrations\Tools\Console\Command\UpToDateCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:up-to-date</argument>
<tag name="console.command" command="doctrine:migrations:up-to-date" />
</service>
<service id="doctrine_migrations.version_command" class="Doctrine\Migrations\Tools\Console\Command\VersionCommand">
<argument type="service" id="doctrine.migrations.dependency_factory"/>
<argument>doctrine:migrations:version</argument>
<tag name="console.command" command="doctrine:migrations:version" />
</service>
<service id="doctrine_migrations.schema_filter_listener" class="Doctrine\Bundle\MigrationsBundle\EventListener\SchemaFilterListener">
<tag name="kernel.event_listener" event="console.command" method="onConsoleCommand" />
<tag name="doctrine.dbal.schema_filter" />
</service>
</services>
</container>

View File

@@ -332,10 +332,10 @@ for Doctrine's ORM:
{
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
#[ORM\Column(type: Types:INT)]
#[ORM\Column(type: Types::INTEGER)]
private $id;
#[ORM\Column(type: Types:STRING, length: 255)]
#[ORM\Column(type: Types::STRING, length: 255)]
private $name;
.. code-block:: php-annotations

View File

@@ -1,6 +1,6 @@
parameters:
level: 7
phpVersion: 80200
phpVersion: 80400
paths:
- src
- tests

View File

@@ -16,7 +16,7 @@ use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\DependencyInjection\Reference;
use function array_keys;
@@ -43,9 +43,9 @@ final class DoctrineMigrationsExtension extends Extension
$config = $this->processConfiguration($configuration, $configs);
$locator = new FileLocator(__DIR__ . '/../../config/');
$loader = new XmlFileLoader($container, $locator);
$loader = new PhpFileLoader($container, $locator);
$loader->load('services.xml');
$loader->load('services.php');
$configurationDefinition = $container->getDefinition('doctrine.migrations.configuration');
@@ -123,6 +123,15 @@ final class DoctrineMigrationsExtension extends Extension
}
$configurationDefinition->addMethodCall('setMetadataStorageConfiguration', [new Reference('doctrine.migrations.storage.table_storage')]);
// Add tag to the filter for each Doctrine connection, so the table is ignored for multiple connections
if ($container->hasParameter('doctrine.connections')) {
/** @var array<string, string> $connections */
$connections = $container->getParameter('doctrine.connections');
foreach (array_keys($connections) as $connection) {
$filterDefinition->addTag('doctrine.dbal.schema_filter', ['connection' => $connection]);
}
}
}
if ($config['em'] !== null && $config['connection'] !== null) {

View File

@@ -240,6 +240,10 @@ class DoctrineMigrationsExtensionTest extends TestCase
$di = $container->get('doctrine.migrations.dependency_factory');
self::assertInstanceOf(DependencyFactory::class, $di);
self::assertSame($doctrine->getConnection('custom'), $di->getConnection());
// Check if the multiple connections also added the required tags to the filter
$filterDefinition = $container->findDefinition('doctrine_migrations.schema_filter_listener');
$tags = $filterDefinition->getTag('doctrine.dbal.schema_filter');
self::assertCount(2, $tags);
}
public function testPrefersEntityManagerOverConnection(): void
@@ -250,7 +254,6 @@ class DoctrineMigrationsExtensionTest extends TestCase
],
null,
[
'enable_native_lazy_objects' => true,
'controller_resolver' => ['auto_mapping' => false],
],
);
@@ -419,13 +422,11 @@ class DoctrineMigrationsExtensionTest extends TestCase
private function getContainer(array $config, array|null $dbalConfig = null, array|null $ormConfig = null): ContainerBuilder
{
$container = $this->getContainerBuilder();
$container->setParameter('kernel.build_dir', '');
$bundle = new DoctrineMigrationsBundle();
$bundle->build($container);
$extension = new DoctrineMigrationsExtension();
$extension->load(['doctrine_migrations' => $config], $container);
$extension = new DoctrineExtension();
$doctrineBundleConfigs = $dbalConfig === null ? ['dbal' => ['url' => 'sqlite:///:memory:']] : ['dbal' => $dbalConfig];
@@ -435,9 +436,16 @@ class DoctrineMigrationsExtensionTest extends TestCase
$extension->load(['doctrine' => $doctrineBundleConfigs], $container);
$extension = new DoctrineMigrationsExtension();
$extension->load(['doctrine_migrations' => $config], $container);
$container->getDefinition('doctrine.migrations.dependency_factory')->setPublic(true);
$container->getDefinition('doctrine.migrations.configuration')->setPublic(true);
if ($container->hasDefinition('doctrine_migrations.schema_filter_listener')) {
$container->getDefinition('doctrine_migrations.schema_filter_listener')->setPublic(true);
}
return $container;
}
@@ -454,11 +462,11 @@ class DoctrineMigrationsExtensionTest extends TestCase
'namespace' => $bundle->getNamespace(),
],
],
'kernel.build_dir' => sys_get_temp_dir(),
'kernel.cache_dir' => sys_get_temp_dir(),
'kernel.environment' => 'test',
'kernel.project_dir' => __DIR__ . '/../',
'kernel.root_dir' => __DIR__ ,
'kernel.build_dir' => __DIR__ ,
]));
}
}