[go: nahoru, domu]

Skip to content

Commit

Permalink
Register listeners instead of subscribers
Browse files Browse the repository at this point in the history
Symfony 6.3 deprecated the registration of Doctrine subscribers because
they cannot be lazy-loaded properly.
The CI will ensure that the list of events is in sync with the library.
  • Loading branch information
stof committed Jul 7, 2023
1 parent 5cfabc7 commit 02c4775
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 15 deletions.
77 changes: 72 additions & 5 deletions src/DependencyInjection/StofDoctrineExtensionsExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,69 @@

class StofDoctrineExtensionsExtension extends Extension
{
private const LISTENER_EVENTS = array(
'blameable' => array(
'prePersist',
'onFlush',
'loadClassMetadata',
),
'loggable' => array(
'loadClassMetadata',
'onFlush',
'postPersist',
),
'reference_integrity' => array(
'loadClassMetadata',
'preRemove',
),
'sluggable' => array(
'prePersist',
'onFlush',
'loadClassMetadata',
),
'softdeleteable' => array(
'loadClassMetadata',
'onFlush',
),
'sortable' => array(
'onFlush',
'loadClassMetadata',
'prePersist',
'postPersist',
'preUpdate',
'postRemove',
'postFlush',
),
'timestampable' => array(
'prePersist',
'onFlush',
'loadClassMetadata',
),
'translatable' => array(
'postLoad',
'postPersist',
'preFlush',
'onFlush',
'loadClassMetadata',
),
'tree' => array(
'prePersist',
'preRemove',
'preUpdate',
'onFlush',
'loadClassMetadata',
'postPersist',
'postUpdate',
'postRemove',
),
'uploadable' => array(
'loadClassMetadata',
'preFlush',
'onFlush',
'postFlush',
),
);

private $entityManagers = array();
private $documentManagers = array();

Expand All @@ -28,8 +91,8 @@ public function load(array $configs, ContainerBuilder $container)

$loaded = array();

$this->entityManagers = $this->processObjectManagerConfigurations($config['orm'], $container, $loader, $loaded, 'doctrine.event_subscriber');
$this->documentManagers = $this->processObjectManagerConfigurations($config['mongodb'], $container, $loader, $loaded, 'doctrine_mongodb.odm.event_subscriber');
$this->entityManagers = $this->processObjectManagerConfigurations($config['orm'], $container, $loader, $loaded, 'doctrine.event_listener');
$this->documentManagers = $this->processObjectManagerConfigurations($config['mongodb'], $container, $loader, $loaded, 'doctrine_mongodb.odm.event_listener');

$container->setParameter('stof_doctrine_extensions.default_locale', $config['default_locale']);
$container->setParameter('stof_doctrine_extensions.translation_fallback', $config['translation_fallback']);
Expand Down Expand Up @@ -94,11 +157,11 @@ public function configValidate(ContainerBuilder $container)
* @param ContainerBuilder $container
* @param LoaderInterface $loader
* @param array $loaded
* @param string $doctrineSubscriberTag
* @param string $doctrineListenerTag
*
* @return array
*/
private function processObjectManagerConfigurations(array $configs, ContainerBuilder $container, LoaderInterface $loader, array &$loaded, $doctrineSubscriberTag)
private function processObjectManagerConfigurations(array $configs, ContainerBuilder $container, LoaderInterface $loader, array &$loaded, string $doctrineListenerTag)
{
$usedManagers = array();

Expand Down Expand Up @@ -126,7 +189,11 @@ private function processObjectManagerConfigurations(array $configs, ContainerBui
}

$definition = $container->getDefinition(sprintf('stof_doctrine_extensions.listener.%s', $ext));
$definition->addTag($doctrineSubscriberTag, $attributes);

foreach (self::LISTENER_EVENTS[$ext] as $event) {
$attributes['event'] = $event;
$definition->addTag($doctrineListenerTag, $attributes);
}

$usedManagers[$name] = true;
}
Expand Down
51 changes: 41 additions & 10 deletions tests/DependencyInjection/StofDoctrineExtensionsExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace Stof\DoctrineExtensionsBundle\Tests\DependencyInjection;

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\EventSubscriber;
use Stof\DoctrineExtensionsBundle\DependencyInjection\StofDoctrineExtensionsExtension;
use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\ContainerBuilder;
Expand Down Expand Up @@ -43,11 +45,12 @@ public function testLoadORMConfig($listener)

$def = $container->getDefinition('stof_doctrine_extensions.listener.'.$listener);

$this->assertTrue($def->hasTag('doctrine.event_subscriber'));
$this->assertTrue($def->hasTag('doctrine.event_listener'));

$tags = $def->getTag('doctrine.event_subscriber');
$tags = $def->getTag('doctrine.event_listener');
$configuredManagers = array_unique(array_column($tags, 'connection'));

$this->assertCount(2, $tags);
$this->assertCount(2, $configuredManagers);
}

/**
Expand All @@ -69,11 +72,12 @@ public function testLoadMongodbConfig($listener)

$def = $container->getDefinition('stof_doctrine_extensions.listener.'.$listener);

$this->assertTrue($def->hasTag('doctrine_mongodb.odm.event_subscriber'));
$this->assertTrue($def->hasTag('doctrine_mongodb.odm.event_listener'));

$tags = $def->getTag('doctrine_mongodb.odm.event_subscriber');
$tags = $def->getTag('doctrine_mongodb.odm.event_listener');
$configuredManagers = array_unique(array_column($tags, 'connection'));

$this->assertCount(2, $tags);
$this->assertCount(2, $configuredManagers);
}

/**
Expand All @@ -95,10 +99,37 @@ public function testLoadBothConfig($listener)

$def = $container->getDefinition('stof_doctrine_extensions.listener.'.$listener);

$this->assertTrue($def->hasTag('doctrine.event_subscriber'));
$this->assertTrue($def->hasTag('doctrine_mongodb.odm.event_subscriber'));
$this->assertTrue($def->hasTag('doctrine.event_listener'));
$this->assertTrue($def->hasTag('doctrine_mongodb.odm.event_listener'));

$this->assertCount(1, $def->getTag('doctrine.event_subscriber'));
$this->assertCount(1, $def->getTag('doctrine_mongodb.odm.event_subscriber'));
$this->assertCount(1, array_unique(array_column($def->getTag('doctrine.event_listener'), 'connection')));
$this->assertCount(1, array_unique(array_column($def->getTag('doctrine_mongodb.odm.event_listener'), 'connection')));
}

/**
* @dataProvider provideExtensions
*/
public function testEventConsistency(string $listener)
{
$extension = new StofDoctrineExtensionsExtension();
$container = new ContainerBuilder();
$container->register('annotation_reader', AnnotationReader::class);

$config = array('orm' => array(
'default' => array($listener => true),
));

$extension->load(array($config), $container);

$def = $container->getDefinition('stof_doctrine_extensions.listener.'.$listener);
$configuredEvents = array_column($def->getTag('doctrine.event_listener'), 'event');

$listenerInstance = $container->get('stof_doctrine_extensions.listener.'.$listener);

if (!$listenerInstance instanceof EventSubscriber) {
$this->markTestSkipped(sprintf('The listener for "%s" is not a Doctrine event subscriber.', $listener));
}

$this->assertEqualsCanonicalizing($listenerInstance->getSubscribedEvents(), $configuredEvents);
}
}

0 comments on commit 02c4775

Please sign in to comment.