8000 [DoctrineBridge] deprecate doctrine schema subscribers in favor of listeners by alli83 · Pull Request #49610 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

[DoctrineBridge] deprecate doctrine schema subscribers in favor of listeners #49610

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions UPGRADE-6.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ DependencyInjection
* Deprecate `PhpDumper` options `inline_factories_parameter` and `inline_class_loader_parameter`, use `inline_factories` and `inline_class_loader` instead
* Deprecate undefined and numeric keys with `service_locator` config, use string aliases instead

DoctrineBridge
--------------

* Deprecate `DoctrineDbalCacheAdapterSchemaSubscriber` in favor of `DoctrineDbalCacheAdapterSchemaListener`
* Deprecate `MessengerTransportDoctrineSchemaSubscriber` in favor of `MessengerTransportDoctrineSchemaListener`
* Deprecate `RememberMeTokenProviderDoctrineSchemaSubscriber` in favor of `RememberMeTokenProviderDoctrineSchemaListener`

FrameworkBundle
---------------

Expand Down
8 changes: 8 additions & 0 deletions src/Symfony/Bridge/Doctrine/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
CHANGELOG
=========

6.3
---

* Add `AbstractSchemaListener`, `LockStoreSchemaListener` and `PdoSessionHandlerSchemaListener`
* Deprecate `DoctrineDbalCacheAdapterSchemaSubscriber` in favor of `DoctrineDbalCacheAdapterSchemaListener`
* Deprecate `MessengerTransportDoctrineSchemaSubscriber` in favor of `MessengerTransportDoctrineSchemaListener`
* Deprecate `RememberMeTokenProviderDoctrineSchemaSubscriber` in favor of `RememberMeTokenProviderDoctrineSchemaListener`

6.2
---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,14 @@

namespace Symfony\Bridge\Doctrine\SchemaListener;

use Doctrine\Common\EventSubscriber;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Exception\TableNotFoundException;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
use Doctrine\ORM\Tools\ToolEvents;

abstract class AbstractSchemaSubscriber implements EventSubscriber
abstract class AbstractSchemaListener
{
abstract public function postGenerateSchema(GenerateSchemaEventArgs $event): void;

public function getSubscribedEvents(): array
{
if (!class_exists(ToolEvents::class)) {
return [];
}

return [
ToolEvents::postGenerateSchema,
];
}

protected function getIsSameDatabaseChecker(Connection $connection): \Closure
{
return static function (\Closure $exec) use ($connection): bool {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bridge\Doctrine\SchemaListener;

use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
use Symfony\Component\Cache\Adapter\DoctrineDbalAdapter;

/**
* Automatically adds the cache table needed for the DoctrineDbalAdapter of
* the Cache component.
*/
class DoctrineDbalCacheAdapterSchemaListener extends AbstractSchemaListener
{
/**
* @param iterable<mixed, DoctrineDbalAdapter> $dbalAdapters
*/
public function __construct(private iterable $dbalAdapters)
{
}

public function postGenerateSchema(GenerateSchemaEventArgs $event): void
{
$connection = $event->getEntityManager()->getConnection();

foreach ($this->dbalAdapters as $dbalAdapter) {
$dbalAdapter->configureSchema($event->getSchema(), $connection, $this->getIsSameDatabaseChecker($connection));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,30 @@

namespace Symfony\Bridge\Doctrine\SchemaListener;

use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Tools\ToolEvents;
use Symfony\Component\Cache\Adapter\DoctrineDbalAdapter;

trigger_deprecation('symfony/doctrine-bridge', '6.3', 'The "%s" class is deprecated. Use "%s" instead.', DoctrineDbalCacheAdapterSchemaSubscriber::class, DoctrineDbalCacheAdapterSchemaListener::class);

/**
* Automatically adds the cache table needed for the DoctrineDbalAdapter of
* the Cache component.
*
* @author Ryan Weaver <ryan@symfonycasts.com>
*
* @deprecated since Symfony 6.3, use {@link DoctrineDbalCacheAdapterSchemaListener} instead
*/
final class DoctrineDbalCacheAdapterSchemaSubscriber extends AbstractSchemaSubscriber
final class DoctrineDbalCacheAdapterSchemaSubscriber extends DoctrineDbalCacheAdapterSchemaListener implements EventSubscriber
{
private $dbalAdapters;

/**
* @param iterable<mixed, DoctrineDbalAdapter> $dbalAdapters
*/
public function __construct(iterable $dbalAdapters)
{
$this->dbalAdapters = $dbalAdapters;
}

public function postGenerateSchema(GenerateSchemaEventArgs $event): void
public function getSubscribedEvents(): array
{
$connection = $event->getEntityManager()->getConnection();

foreach ($this->dbalAdapters as $dbalAdapter) {
$dbalAdapter->configureSchema($event->getSchema(), $connection, $this->getIsSameDatabaseChecker($connection));
if (!class_exists(ToolEvents::class)) {
return [];
}

return [
ToolEvents::postGenerateSchema,
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
use Symfony\Component\Lock\PersistingStoreInterface;
use Symfony\Component\Lock\Store\DoctrineDbalStore;

final class LockStoreSchemaSubscriber extends AbstractSchemaSubscriber
final class LockStoreSchemaListener extends AbstractSchemaListener
{
/**
* @param iterable<mixed, PersistingStoreInterface> $stores
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bridge\Doctrine\SchemaListener;

use Doctrine\DBAL\Event\SchemaCreateTableEventArgs;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
use Symfony\Component\Messenger\Bridge\Doctrine\Transport\DoctrineTransport;
use Symfony\Component\Messenger\Transport\TransportInterface;

/**
* Automatically adds any required database tables to the Doctrine Schema.
*/
class MessengerTransportDoctrineSchemaListener extends AbstractSchemaListener
{
private const PROCESSING_TABLE_FLAG = self::class.':processing';

/**
* @param iterable<mixed, TransportInterface> $transports
*/
public function __construct(private iterable $transports)
{
}

public function postGenerateSchema(GenerateSchemaEventArgs $event): void
{
$connection = $event->getEntityManager()->getConnection();

foreach ($this->transports as $transport) {
if (!$transport instanceof DoctrineTransport) {
continue;
}

$transport->configureSchema($event->getSchema(), $connection, $this->getIsSameDatabaseChecker($connection));
}
}

public function onSchemaCreateTable(SchemaCreateTableEventArgs $event): void
{
$table = $event->getTable();

// if this method triggers a nested create table below, allow Doctrine to work like normal
if ($table->hasOption(self::PROCESSING_TABLE_FLAG)) {
return;
}

foreach ($this->transports as $transport) {
if (!$transport instanceof DoctrineTransport) {
continue;
}

if (!$extraSql = $transport->getExtraSetupSqlForTable($table)) {
continue;
}

// avoid this same listener from creating a loop on this table
$table->addOption(self::PROCESSING_TABLE_FLAG, true);
$createTableSql = $event->getPlatform()->getCreateTableSQL($table);

/*
* Add all the SQL needed to create the table and tell Doctrine
* to "preventDefault" so that only our SQL is used. This is
* the only way to inject some extra SQL.
*/
$event->addSql($createTableSql);
foreach ($extraSql as $sql) {
$event->addSql($sql);
}
$event->preventDefault();

return;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,84 +11,28 @@

namespace Symfony\Bridge\Doctrine\SchemaListener;

use Doctrine\DBAL\Event\SchemaCreateTableEventArgs;
use Doctrine\Common\EventSubscriber;
use Doctrine\DBAL\Events;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
use Symfony\Component\Messenger\Bridge\Doctrine\Transport\DoctrineTransport;
use Symfony\Component\Messenger\Transport\TransportInterface;
use Doctrine\ORM\Tools\ToolEvents;

trigger_deprecation('symfony/doctrine-bridge', '6.3', 'The "%s" class is deprecated. Use "%s" instead.', MessengerTransportDoctrineSchemaSubscriber::class, MessengerTransportDoctrineSchemaListener::class);

/**
* Automatically adds any required database tables to the Doctrine Schema.
*
* @author Ryan Weaver <ryan@symfonycasts.com>
*
* @deprecated since Symfony 6.3, use {@link MessengerTransportDoctrineSchemaListener} instead
*/
final class MessengerTransportDoctrineSchemaSubscriber extends AbstractSchemaSubscriber
final class MessengerTransportDoctrineSchemaSubscriber extends MessengerTransportDoctrineSchemaListener implements EventSubscriber
{
private const PROCESSING_TABLE_FLAG = self::class.':processing';

private iterable $transports;

/**
* @param iterable<mixed, TransportInterface> $transports
*/
public function __construct(iterable $transports)
{
$this->transports = $transports;
}

public function postGenerateSchema(GenerateSchemaEventArgs $event): void
{
$connection = $event->getEntityManager()->getConnection();

foreach ($this->transports as $transport) {
if (!$transport instanceof DoctrineTransport) {
continue;
}

$transport->configureSchema($event->getSchema(), $connection, $this->getIsSameDatabaseChecker($connection));
}
}

public function onSchemaCreateTable(SchemaCreateTableEventArgs $event): void
public function getSubscribedEvents(): array
{
$table = $event->getTable();

// if this method triggers a nested create table below, allow Doctrine to work like normal
if ($table->hasOption(self::PROCESSING_TABLE_FLAG)) {
return;
}

foreach ($this->transports as $transport) {
if (!$transport instanceof DoctrineTransport) {
continue;
}

if (!$extraSql = $transport->getExtraSetupSqlForTable($table)) {
continue;
}
$subscribedEvents = [];

// avoid this same listener from creating a loop on this table
$table->addOption(self::PROCESSING_TABLE_FLAG, true);
$createTableSql = $event->getPlatform()->getCreateTableSQL($table);

/*
* Add all the SQL needed to create the table and tell Doctrine
* to "preventDefault" so that only our SQL is used. This is
* the only way to inject some extra SQL.
*/
$event->addSql($createTableSql);
foreach ($extraSql as $sql) {
$event->addSql($sql);
}
$event->preventDefault();

return;
if (class_exists(ToolEvents::class)) {
$subscribedEvents[] = ToolEvents::postGenerateSchema;
}
}

public function getSubscribedEvents(): array
{
$subscribedEvents = parent::getSubscribedEvents();

if (class_exists(Events::class)) {
$subscribedEvents[] = Events::onSchemaCreateTable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler;

final class PdoSessionHandlerSchemaSubscriber extends AbstractSchemaSubscriber
final class PdoSessionHandlerSchemaListener extends AbstractSchemaListener
{
private PdoSessionHandler $sessionHandler;

Expand All @@ -25,13 +25,12 @@ public function __construct(\SessionHandlerInterface $sessionHandler)
}
}

public function getSubscribedEvents(): array
{
return isset($this->sessionHandler) ? parent::getSubscribedEvents() : [];
}

public function postGenerateSchema(GenerateSchemaEventArgs $event): void
{
if (!isset($this->sessionHandler)) {
return;
}

$connection = $event->getEntityManager()->getConnection();

$this->sessionHandler->configureSchema($event->getSchema(), $this->getIsSameDatabaseChecker($connection));
Expand Down
Loading
0