[go: nahoru, domu]

Skip to content

Commit

Permalink
Merge pull request #451 from stof/use_doctrine_listener
Browse files Browse the repository at this point in the history
Register listeners instead of subscribers
  • Loading branch information
stof committed Jul 7, 2023
2 parents 5cfabc7 + d4eeb05 commit f3446f6
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 16 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"symfony/dependency-injection": "^4.4 || ^5.2 || ^6.0",
"symfony/event-dispatcher": "^4.4 || ^5.2 || ^6.0",
"symfony/http-kernel": "^4.4 || ^5.2 || ^6.0",
"gedmo/doctrine-extensions": "^2.3.4 || ^3.0.0"
"gedmo/doctrine-extensions": "^2.3.12 || ^3.0.0"
},
"require-dev": {
"symfony/mime": "^4.4 || ^5.2 || ^6.0",
Expand Down
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 f3446f6

Please sign in to comment.