Skip to content

Commit ca59d84

Browse files
authored
Merge pull request #1820 from doctrine/2.12.x-merge-up-into-2.13.x_od3vo4jA
2 parents 9926a4a + f633ea3 commit ca59d84

File tree

8 files changed

+58
-32
lines changed

8 files changed

+58
-32
lines changed

config/messenger.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@
5252
</service>
5353

5454
<service id="doctrine.orm.messenger.doctrine_schema_subscriber" class="Symfony\Bridge\Doctrine\SchemaListener\MessengerTransportDoctrineSchemaSubscriber">
55-
<argument type="tagged" tag="messenger.receiver" />
55+
<argument type="tagged_iterator" tag="messenger.receiver" />
5656
<tag name="doctrine.event_subscriber" />
5757
</service>
5858
<service id="doctrine.orm.messenger.doctrine_schema_listener" class="Symfony\Bridge\Doctrine\SchemaListener\MessengerTransportDoctrineSchemaListener">
59-
<argument type="tagged" tag="messenger.receiver" />
59+
<argument type="tagged_iterator" tag="messenger.receiver" />
6060
<tag name="doctrine.event_listener" event="postGenerateSchema" />
6161
<tag name="doctrine.event_listener" event="onSchemaCreateTable" />
6262
</service>

config/orm.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -148,19 +148,19 @@
148148
<tag name="doctrine.event_subscriber" />
149149
</service>
150150
<service id="doctrine.orm.listeners.doctrine_token_provider_schema_subscriber" class="Symfony\Bridge\Doctrine\SchemaListener\RememberMeTokenProviderDoctrineSchemaSubscriber">
151-
<argument type="tagged" tag="security.remember_me_handler" />
151+
<argument type="tagged_iterator" tag="security.remember_me_handler" />
152152
<tag name="doctrine.event_subscriber" />
153153
</service>
154154
<service id="doctrine.orm.listeners.doctrine_token_provider_schema_listener" class="Symfony\Bridge\Doctrine\SchemaListener\RememberMeTokenProviderDoctrineSchemaListener">
155-
<argument type="tagged" tag="security.remember_me_handler" />
155+
<argument type="tagged_iterator" tag="security.remember_me_handler" />
156156
<tag name="doctrine.event_listener" event="postGenerateSchema" />
157157
</service>
158158
<service id="doctrine.orm.listeners.pdo_session_handler_schema_listener" class="Symfony\Bridge\Doctrine\SchemaListener\PdoSessionHandlerSchemaListener">
159159
<argument type="service" id="session.handler" />
160160
<tag name="doctrine.event_listener" event="postGenerateSchema" />
161161
</service>
162162
<service id="doctrine.orm.listeners.lock_store_schema_listener" class="Symfony\Bridge\Doctrine\SchemaListener\LockStoreSchemaListener">
163-
<argument type="tagged" tag="lock.store" />
163+
<argument type="tagged_iterator" tag="lock.store" />
164164
<tag name="doctrine.event_listener" event="postGenerateSchema" />
165165
</service>
166166

docs/configuration.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ configuration for the ORM and there are several configuration options that you
740740
can control. The following configuration options exist for a mapping:
741741

742742
``type``
743-
One of ``annotation``, ``xml``, ``yml``, ``php`` or ``staticphp``.
743+
One of ``attribute``, ``xml``, ``yml``, ``php`` or ``staticphp``.
744744
This specifies which type of metadata type your mapping uses.
745745

746746
``dir``

docs/custom-id-generators.rst

+5-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ and implement the custom logic in the ``generate(EntityManager $em, $entity)``
77
method. Before Doctrine bundle 2.3, custom ID generators were always created
88
without any constructor arguments.
99

10-
Starting with Doctrine bundle 2.3, the ``CustomIdGenerator`` annotation can be
10+
Starting with Doctrine bundle 2.3, the ``CustomIdGenerator`` attribute can be
1111
used to reference any services tagged with the ``doctrine.id_generator`` tag.
1212
If you enable autoconfiguration (which is the default most of the time), Symfony
1313
will add this tag for you automatically if you implement your own id-generators.
@@ -28,12 +28,10 @@ are provided: ``doctrine.ulid_generator`` to generate ULIDs, and
2828
*/
2929
class User
3030
{
31-
/**
32-
* @Id
33-
* @Column(type="uuid")
34-
* @ORM\GeneratedValue(strategy="CUSTOM")
35-
* @ORM\CustomIdGenerator("doctrine.uuid_generator")
36-
*/
31+
#[ORM\Id]
32+
#[ORM\Column(type: 'uuid')]
33+
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
34+
#[ORM\CustomIdGenerator('doctrine.uuid_generator')]
3735
private $id;
3836
3937
// ....

docs/entity-listeners.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ Entity Listeners
22
================
33

44
Entity listeners that are services must be registered with the entity listener
5-
resolver. On top of the annotation in the entity class, you have to tag the
5+
resolver. On top of the annotation/attribute in the entity class, you have to tag the
66
service with ``doctrine.orm.entity_listener`` for it to be automatically added
77
to the resolver. Use the (optional) ``entity_manager`` attribute to specify
88
which entity manager it should be registered with.

src/Command/DropDatabaseDoctrineCommand.php

-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int
105105

106106
try {
107107
if ($shouldDropDatabase) {
108-
/** @psalm-suppress TypeDoesNotContainType Bogus error, Doctrine\DBAL\Schema\AbstractSchemaManager<Doctrine\DBAL\Platforms\AbstractPlatform> does contain Doctrine\DBAL\Schema\SQLiteSchemaManager */
109108
if ($schemaManager instanceof SQLiteSchemaManager) {
110109
// dropDatabase() is deprecated for Sqlite
111110
$connection->close();

src/DependencyInjection/Compiler/MiddlewaresPass.php

+19-17
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Symfony\Component\DependencyInjection\ChildDefinition;
77
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
88
use Symfony\Component\DependencyInjection\ContainerBuilder;
9+
use Symfony\Component\DependencyInjection\Reference;
910

1011
use function array_key_exists;
1112
use function array_keys;
@@ -44,20 +45,21 @@ public function process(ContainerBuilder $container): void
4445
}
4546

4647
foreach (array_keys($container->getParameter('doctrine.connections')) as $name) {
47-
$middlewareDefs = [];
48+
$middlewareRefs = [];
4849
$i = 0;
4950
foreach ($middlewareAbstractDefs as $id => $abstractDef) {
5051
if (isset($middlewareConnections[$id]) && ! array_key_exists($name, $middlewareConnections[$id])) {
5152
continue;
5253
}
5354

54-
$middlewareDefs[$id] = [
55-
$childDef = $container->setDefinition(
56-
sprintf('%s.%s', $id, $name),
57-
new ChildDefinition($id),
58-
),
59-
++$i,
60-
];
55+
$childDef = $container->setDefinition(
56+
$childId = sprintf('%s.%s', $id, $name),
57+
(new ChildDefinition($id))
58+
->setTags($abstractDef->getTags())->clearTag('doctrine.middleware')
59+
->setAutoconfigured($abstractDef->isAutoconfigured())
60+
->setAutowired($abstractDef->isAutowired()),
61+
);
62+
$middlewareRefs[$id] = [new Reference($childId), ++$i];
6163

6264
if (! is_subclass_of($abstractDef->getClass(), ConnectionNameAwareInterface::class)) {
6365
continue;
@@ -66,21 +68,21 @@ public function process(ContainerBuilder $container): void
6668
$childDef->addMethodCall('setConnectionName', [$name]);
6769
}
6870

69-
$middlewareDefs = array_map(
70-
static fn ($id, $def) => [
71+
$middlewareRefs = array_map(
72+
static fn (string $id, array $ref) => [
7173
$middlewareConnections[$id][$name] ?? $middlewarePriorities[$id] ?? 0,
72-
$def[1],
73-
$def[0],
74+
$ref[1],
75+
$ref[0],
7476
],
75-
array_keys($middlewareDefs),
76-
array_values($middlewareDefs),
77+
array_keys($middlewareRefs),
78+
array_values($middlewareRefs),
7779
);
78-
uasort($middlewareDefs, static fn ($a, $b) => $b[0] <=> $a[0] ?: $a[1] <=> $b[1]);
79-
$middlewareDefs = array_map(static fn ($value) => $value[2], $middlewareDefs);
80+
uasort($middlewareRefs, static fn (array $a, array $b): int => $b[0] <=> $a[0] ?: $a[1] <=> $b[1]);
81+
$middlewareRefs = array_map(static fn (array $value): Reference => $value[2], $middlewareRefs);
8082

8183
$container
8284
->getDefinition(sprintf('doctrine.dbal.%s_connection.configuration', $name))
83-
->addMethodCall('setMiddlewares', [$middlewareDefs]);
85+
->addMethodCall('setMiddlewares', [$middlewareRefs]);
8486
}
8587
}
8688
}

tests/DependencyInjection/Compiler/MiddlewarePassTest.php

+27
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\DependencyInjection\ContainerBuilder;
1616
use Symfony\Component\DependencyInjection\Definition;
1717
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
18+
use Symfony\Component\DependencyInjection\Reference;
1819

1920
use function array_map;
2021
use function class_exists;
@@ -306,6 +307,28 @@ public function testAddMiddlewareOrderingWithInheritedPriorityPerConnection(): v
306307
$this->assertMiddlewareOrdering($container, 'conn2', $expectedMiddlewares);
307308
}
308309

310+
public function testInjectedMiddlewaresPreserveParentDefinition(): void
311+
{
312+
$container = $this->createContainer(static function (ContainerBuilder $container): void {
313+
$container
314+
->register('middleware', PHP7Middleware::class)
315+
->setPublic(true)
316+
->setAutowired(true)
317+
->setAutoconfigured(true)
318+
->addTag('doctrine.middleware')->addTag('custom.tag');
319+
$container
320+
->setAlias('conf_conn', 'doctrine.dbal.conn1_connection.configuration')
321+
->setPublic(true); // Avoid removal and inlining
322+
});
323+
$this->assertMiddlewareInjected($container, 'conn', PHP7Middleware::class);
324+
$this->assertNotNull($definition = $container->getDefinition('middleware.conn1'));
325+
$this->assertCount(1, $middlewares = $this->getMiddlewaresForConn($container, 'conn', PHP7Middleware::class));
326+
$this->assertSame(true, $definition->isAutowired());
327+
$this->assertSame(true, $definition->isAutoconfigured());
328+
$this->assertSame(['custom.tag' => [[]]], $definition->getTags());
329+
$this->assertSame($middlewares[0], $definition);
330+
}
331+
309332
/** @requires PHP 8 */
310333
public function testAddMiddlewareOrderingWithAttributeForAutoconfiguration(): void
311334
{
@@ -466,6 +489,10 @@ private function getMiddlewaresForConn(ContainerBuilder $container, string $conn
466489
}
467490

468491
foreach ($call[1][0] as $middlewareDef) {
492+
if ($middlewareDef instanceof Reference) {
493+
$middlewareDef = $container->getDefinition($middlewareDef->__toString());
494+
}
495+
469496
if (isset($middlewareClass) && $middlewareDef->getClass() !== $middlewareClass) {
470497
continue;
471498
}

0 commit comments

Comments
 (0)