8000 feature #49610 [DoctrineBridge] deprecate doctrine schema subscribers… · symfony/symfony@6858de9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 6858de9

Browse files
feature #49610 [DoctrineBridge] deprecate doctrine schema subscribers in favor of listeners (alli83)
This PR was merged into the 6.3 branch. Discussion ---------- [DoctrineBridge] deprecate doctrine schema subscribers in favor of listeners | Q | A | ------------- | --- | Branch? | 6.3 | Bug fix? | yes | New feature? | no | Deprecations? | yes | Tickets | Fix #49387 | License | MIT | Doc PR | As `@nicolas`-grekas explained in #49387 (comment) : " Because PdoSessionHandlerSchemaSubscriber is registered as a subscriber, ContainerAwareEventManager must instantiate it to know which events should be listened for. This triggers the instantiation of the session.handler service, which is a NativeFileSessionHandler, and this notice when this is done after headers have been sent." It was therefore decided to change all the doctrine schema subscribers in favor of listeners in order to avoid this kind of problem. Being already present before Symfony 6.3, `MessengerTransportDoctrineSchemaSubscriber`, `DoctrineDbalCacheAdapterSchemaSubscriber` and `RememberMeTokenProviderDoctrineSchemaSubscriber`have been deprecated. TODO: - [ ] : update DoctrineBundle => in progress Commits ------- 787d569 [DoctrineBridge] deprecate doctrine schema subscribers in favor of listeners
2 parents 32f2ec9 + 787d569 commit 6858de9

14 files changed

+236
-138
lines changed

UPGRADE-6.3.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ DependencyInjection
1313
* Deprecate `PhpDumper` options `inline_factories_parameter` and `inline_class_loader_parameter`, use `inline_factories` and `inline_class_loader` instead
1414
* Deprecate undefined and numeric keys with `service_locator` config, use string aliases instead
1515

16+
DoctrineBridge
17+
--------------
18+
19+
* Deprecate `DoctrineDbalCacheAdapterSchemaSubscriber` in favor of `DoctrineDbalCacheAdapterSchemaListener`
20+
* Deprecate `MessengerTransportDoctrineSchemaSubscriber` in favor of `MessengerTransportDoctrineSchemaListener`
21+
* Deprecate `RememberMeTokenProviderDoctrineSchemaSubscriber` in favor of `RememberMeTokenProviderDoctrineSchemaListener`
22+
1623
FrameworkBundle
1724
---------------
1825

src/Symfony/Bridge/Doctrine/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
CHANGELOG
22
=========
33

4+
6.3
5+
---
6+
7+
* Add `AbstractSchemaListener`, `LockStoreSchemaListener` and `PdoSessionHandlerSchemaListener`
8+
* Deprecate `DoctrineDbalCacheAdapterSchemaSubscriber` in favor of `DoctrineDbalCacheAdapterSchemaListener`
9+
* Deprecate `MessengerTransportDoctrineSchemaSubscriber` in favor of `MessengerTransportDoctrineSchemaListener`
10+
* Deprecate `RememberMeTokenProviderDoctrineSchemaSubscriber` in favor of `RememberMeTokenProviderDoctrineSchemaListener`
11+
412
6.2
513
---
614

src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaSubscriber.php renamed to src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,14 @@
1111

1212
namespace Symfony\Bridge\Doctrine\SchemaListener;
1313

14-
use Doctrine\Common\EventSubscriber;
1514
use Doctrine\DBAL\Connection;
1615
use Doctrine\DBAL\Exception\TableNotFoundException;
1716
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
18-
use Doctrine\ORM\Tools\ToolEvents;
1917

20-
abstract class AbstractSchemaSubscriber implements EventSubscriber
18+
abstract class AbstractSchemaListener
2119
{
2220
abstract public function postGenerateSchema(GenerateSchemaEventArgs $event): void;
2321

24-
public function getSubscribedEvents(): array
25-
{
26-
if (!class_exists(ToolEvents::class)) {
27-
return [];
28-
}
29-
30-
return [
31-
ToolEvents::postGenerateSchema,
32-
];
33-
}
34-
3522
protected function getIsSameDatabaseChecker(Connection $connection): \Closure
3623
{
3724
return static function (\Closure $exec) use ($connection): bool {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bridge\Doctrine\SchemaListener;
13+
14+
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
15+
use Symfony\Component\Cache\Adapter\DoctrineDbalAdapter;
16+
17+
/**
18+
* Automatically adds the cache table needed for the DoctrineDbalAdapter of
19+
* the Cache component.
20+
*/
21+
class DoctrineDbalCacheAdapterSchemaListener extends AbstractSchemaListener
22+
{
23+
/**
24+
* @param iterable<mixed, DoctrineDbalAdapter> $dbalAdapters
25+
*/
26+
public function __construct(private iterable $dbalAdapters)
27+
{
28+
}
29+
30+
public function postGenerateSchema(GenerateSchemaEventArgs $event): void
31+
{
32+
$connection = $event->getEntityManager()->getConnection();
33+
34+
foreach ($this->dbalAdapters as $dbalAdapter) {
35+
$dbalAdapter->configureSchema($event->getSchema(), $connection, $this->getIsSameDatabaseChecker($connection));
36+
}
37+
}
38+
}

src/Symfony/Bridge/Doctrine/SchemaListener/DoctrineDbalCacheAdapterSchemaSubscriber.php

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,33 +11,30 @@
1111

1212
namespace Symfony\Bridge\Doctrine\SchemaListener;
1313

14-
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
14+
use Doctrine\Common\EventSubscriber;
15+
use Doctrine\ORM\Tools\ToolEvents;
1516
use Symfony\Component\Cache\Adapter\DoctrineDbalAdapter;
1617

18+
trigger_deprecation('symfony/doctrine-bridge', '6.3', 'The "%s" class is deprecated. Use "%s" instead.', DoctrineDbalCacheAdapterSchemaSubscriber::class, DoctrineDbalCacheAdapterSchemaListener::class);
19+
1720
/**
1821
* Automatically adds the cache table needed for the DoctrineDbalAdapter of
1922
* the Cache component.
2023
*
2124
* @author Ryan Weaver <ryan@symfonycasts.com>
25+
*
26+
* @deprecated since Symfony 6.3, use {@link DoctrineDbalCacheAdapterSchemaListener} instead
2227
*/
23-
final class DoctrineDbalCacheAdapterSchemaSubscriber extends AbstractSchemaSubscriber
28+
final class DoctrineDbalCacheAdapterSchemaSubscriber extends DoctrineDbalCacheAdapterSchemaListener implements EventSubscriber
2429
{
25-
private $dbalAdapters;
26-
27-
/**
28-
* @param iterable<mixed, DoctrineDbalAdapter> $dbalAdapters
29-
*/
30-
public function __construct(iterable $dbalAdapters)
31-
{
32-
$this->dbalAdapters = $dbalAdapters;
33-
}
34-
35-
public function postGenerateSchema(GenerateSchemaEventArgs $event): void
30+
public function getSubscribedEvents(): array
3631
{
37-
$connection = $event->getEntityManager()->getConnection();
38-
39-
foreach ($this->dbalAdapters as $dbalAdapter) {
40-
$dbalAdapter->configureSchema($event->getSchema(), $connection, $this->getIsSameDatabaseChecker($connection));
32+
if (!class_exists(ToolEvents::class)) {
33+
return [];
4134
}
35+
36+
return [
37+
ToolEvents::postGenerateSchema,
38+
];
4239
}
4340
}

src/Symfony/Bridge/Doctrine/SchemaListener/LockStoreSchemaSubscriber.php renamed to src/Symfony/Bridge/Doctrine/SchemaListener/LockStoreSchemaListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use Symfony\Component\Lock\PersistingStoreInterface;
1616
use Symfony\Component\Lock\Store\DoctrineDbalStore;
1717

18-
final class LockStoreSchemaSubscriber extends AbstractSchemaSubscriber
18+
final class LockStoreSchemaListener extends AbstractSchemaListener
1919
{
2020
/**
2121
* @param iterable<mixed, PersistingStoreInterface> $stores
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bridge\Doctrine\SchemaListener;
13+
14+
use Doctrine\DBAL\Event\SchemaCreateTableEventArgs;
15+
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
16+
use Symfony\Component\Messenger\Bridge\Doctrine\Transport\DoctrineTransport;
17+
use Symfony\Component\Messenger\Transport\TransportInterface;
18+
19+
/**
20+
* Automatically adds any required database tables to the Doctrine Schema.
21+
*/
22+
class MessengerTransportDoctrineSchemaListener extends AbstractSchemaListener
23+
{
24+
private const PROCESSING_TABLE_FLAG = self::class.':processing';
25+
26+
/**
27+
* @param iterable<mixed, TransportInterface> $transports
28+
*/
29+
public function __construct(private iterable $transports)
30+
{
31+
}
32+
33+
public function postGenerateSchema(GenerateSchemaEventArgs $event): void
34+
{
35+
$connection = $event->getEntityManager()->getConnection();
36+
37+
foreach ($this->transports as $transport) {
38+
if (!$transport instanceof DoctrineTransport) {
39+
continue;
40+
}
41+
42+
$transport->configureSchema($event->getSchema(), $connection, $this->getIsSameDatabaseChecker($connection));
43+
}
44+
}
45+
46+
public function onSchemaCreateTable(SchemaCreateTableEventArgs $event): void
47+
{
48+
$table = $event->getTable();
49+
50+
// if this method triggers a nested create table below, allow Doctrine to work like normal
51+
if ($table->hasOption(self::PROCESSING_TABLE_FLAG)) {
52+
return;
53+
}
54+
55+
foreach ($this->transports as $transport) {
56+
if (!$transport instanceof DoctrineTransport) {
57+
continue;
58+
}
59+
60+
if (!$extraSql = $transport->getExtraSetupSqlForTable($table)) {
61+
continue;
62+
}
63+
64+
// avoid this same listener from creating a loop on this table
65+
$table->addOption(self::PROCESSING_TABLE_FLAG, true);
66+
$createTableSql = $event->getPlatform()->getCreateTableSQL($table);
67+
68+
/*
69+
* Add all the SQL needed to create the table and tell Doctrine
70+
* to "preventDefault" so that only our SQL is used. This is
71+
* the only way to inject some extra SQL.
72+
*/
73+
$event->addSql($createTableSql);
74+
foreach ($extraSql as $sql) {
75+
$event->addSql($sql);
76+
}
77+
$event->preventDefault();
78+
79+
return;
80+
}
81+
}
82+
}

src/Symfony/Bridge/Doctrine/SchemaListener/MessengerTransportDoctrineSchemaSubscriber.php

Lines changed: 11 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -11,84 +11,28 @@
1111

1212
namespace Symfony\Bridge\Doctrine\SchemaListener;
1313

14-
use Doctrine\DBAL\Event\SchemaCreateTableEventArgs;
14+
use Doctrine\Common\EventSubscriber;
1515
use Doctrine\DBAL\Events;
16-
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
17-
use Symfony\Component\Messenger\Bridge\Doctrine\Transport\DoctrineTransport;
18-
use Symfony\Component\Messenger\Transport\TransportInterface;
16+
use Doctrine\ORM\Tools\ToolEvents;
17+
18+
trigger_deprecation('symfony/doctrine-bridge', '6.3', 'The "%s" class is deprecated. Use "%s" instead.', MessengerTransportDoctrineSchemaSubscriber::class, MessengerTransportDoctrineSchemaListener::class);
1919

2020
/**
2121
* Automatically adds any required database tables to the Doctrine Schema.
2222
*
2323
* @author Ryan Weaver <ryan@symfonycasts.com>
24+
*
25+
* @deprecated since Symfony 6.3, use {@link MessengerTransportDoctrineSchemaListener} instead
2426
*/
25-
final class MessengerTransportDoctrineSchemaSubscriber extends AbstractSchemaSubscriber
27+
final class MessengerTransportDoctrineSchemaSubscriber extends MessengerTransportDoctrineSchemaListener implements EventSubscriber
2628
{
27-
private const PROCESSING_TABLE_FLAG = self::class.':processing';
28-
29-
private iterable $transports;
30-
31-
/**
32-
* @param iterable<mixed, TransportInterface> $transports
33-
*/
34-
public function __construct(iterable $transports)
35-
{
36-
$this->transports = $transports;
37-
}
38-
39-
public function postGenerateSchema(GenerateSchemaEventArgs $event): void
40-
{
41-
$connection = $event->getEntityManager()->getConnection();
42-
43-
foreach ($this->transports as $transport) {
44-
if (!$transport instanceof DoctrineTransport) {
45-
continue;
46-
}
47-
48-
$transport->configureSchema($event->getSchema(), $connection, $this->getIsSameDatabaseChecker($connection));
49-
}
50-
}
51-
52-
public function onSchemaCreateTable(SchemaCreateTableEventArgs $event): void
29+
public function getSubscribedEvents(): array
5330
{
54-
$table = $event->getTable();
55-
56-
// if this method triggers a nested create table below, allow Doctrine to work like normal
57-
if ($table->hasOption(self::PROCESSING_TABLE_FLAG)) {
58-
return;
59-
}
60-
61-
foreach ($this->transports as $transport) {
62-
if (!$transport instanceof DoctrineTransport) {
63-
continue;
64-
}
65-
66-
if (!$extraSql = $transport->getExtraSetupSqlForTable($table)) {
67-
continue;
68-
}
31+
$subscribedEvents = [];
6932

70-
// avoid this same listener from creating a loop on this table
71-
$table->addOption(self::PROCESSING_TABLE_FLAG, true);
72-
$createTableSql = $event->getPlatform()->getCreateTableSQL($table);
73-
74-
/*
75-
* Add all the SQL needed to create the table and tell Doctrine
76-
* to "preventDefault" so that only our SQL is used. This is
77-
* the only way to inject some extra SQL.
78-
*/
79-
$event->addSql($createTableSql);
80-
foreach ($extraSql as $sql) {
81-
$event->addSql($sql);
82-
}
83-
$event->preventDefault();
84-
85-
return;
33+
if (class_exists(ToolEvents::class)) {
34+
$subscribedEvents[] = ToolEvents::postGenerateSchema;
8635
}
87-
}
88-
89-
public function getSubscribedEvents(): array
90-
{
91-
$subscribedEvents = parent::getSubscribedEvents();
9236

9337
if (class_exists(Events::class)) {
9438
$subscribedEvents[] = Events::onSchemaCreateTable;

src/Symfony/Bridge/Doctrine/SchemaListener/PdoSessionHandlerSchemaSubscriber.php renamed to src/Symfony/Bridge/Doctrine/SchemaListener/PdoSessionHandlerSchemaListener.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
1515
use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler;
1616

17-
final class PdoSessionHandlerSchemaSubscriber extends AbstractSchemaSubscriber
17+
final class PdoSessionHandlerSchemaListener extends AbstractSchemaListener
1818
{
1919
private PdoSessionHandler $sessionHandler;
2020

@@ -25,13 +25,12 @@ public function __construct(\SessionHandlerInterface $sessionHandler)
2525
}
2626
}
2727

28-
public function getSubscribedEvents(): array
29-
{
30-
return isset($this->sessionHandler) ? parent::getSubscribedEvents() : [];
31-
}
32-
3328
public function postGenerateSchema(GenerateSchemaEventArgs $event): void
3429
{
30+
if (!isset($this->sessionHandler)) {
31+
return;
32+
}
33+
3534
$connection = $event->getEntityManager()->getConnection();
3635

3736
$this->sessionHandler->configureSchema($event->getSchema(), $this->getIsSameDatabaseChecker($connection));

0 commit comments

Comments
315B  (0)
0