From 85202a90e5efd4e8776bb43a1bec622d6d404793 Mon Sep 17 00:00:00 2001 From: Thomas Rabaix Date: Wed, 15 May 2024 17:23:43 +0200 Subject: [PATCH] Make the code compatible with DBAL 3 and 4 by swithing the type when the Mapping is loaded --- composer.json | 1 - src/Entity/BaseUser3.php | 18 ++----- src/Listener/DoctrineMappingListener.php | 54 +++++++++++++++++++ .../config/doctrine/BaseUser.orm.xml | 2 +- .../config/doctrine/BaseUser3.orm.xml | 22 -------- src/Resources/config/orm.php | 9 ++++ 6 files changed, 69 insertions(+), 37 deletions(-) create mode 100644 src/Listener/DoctrineMappingListener.php delete mode 100644 src/Resources/config/doctrine/BaseUser3.orm.xml diff --git a/composer.json b/composer.json index b6b5ea66c..6ff5a7898 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,6 @@ "doctrine/collections": "^1.6 || ^2.0", "doctrine/common": "^3.1", "doctrine/persistence": "^3.0.2", - "sonata-project/doctrine-extensions": "^1.13 || ^2.0", "sonata-project/form-extensions": "^1.4 || ^2.0", "sonata-project/twig-extensions": "^1.3 || ^2.0", "symfony/config": "^5.4 || ^6.2", diff --git a/src/Entity/BaseUser3.php b/src/Entity/BaseUser3.php index 1969326b4..73caa18c1 100644 --- a/src/Entity/BaseUser3.php +++ b/src/Entity/BaseUser3.php @@ -13,18 +13,10 @@ namespace Sonata\UserBundle\Entity; -use Sonata\UserBundle\Model\User as AbstractedUser; - -class BaseUser3 extends AbstractedUser +/** + * This class is used to avoid error for users that have installed the version + * 5.12.0 of the SonataUserBundle and have not updated the User class. + */ +class BaseUser3 extends BaseUser { - public function prePersist(): void - { - $this->createdAt = new \DateTime(); - $this->updatedAt = new \DateTime(); - } - - public function preUpdate(): void - { - $this->updatedAt = new \DateTime(); - } } diff --git a/src/Listener/DoctrineMappingListener.php b/src/Listener/DoctrineMappingListener.php new file mode 100644 index 000000000..e094ffbb9 --- /dev/null +++ b/src/Listener/DoctrineMappingListener.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Sonata\UserBundle\Listener; + +use Doctrine\ORM\Event\LoadClassMetadataEventArgs; + +/** + * @internal + */ +final class DoctrineMappingListener +{ + private bool $isArrayTypeAvailable; + + public function __construct(private string $userClass) + { + $this->isArrayTypeAvailable = class_exists('Doctrine\DBAL\Types\ArrayType'); + } + + /** + * @throws \Doctrine\DBAL\Exception + */ + public function loadClassMetadata(LoadClassMetadataEventArgs $event): void + { + $metadata = $event->getClassMetadata(); + + if (!$this->isArrayTypeAvailable) { + return; + } + + if ($metadata->getName() !== $this->userClass) { + return; + } + + if (!$metadata->hasField('roles')) { + return; + } + + /** + * @psalm-suppress InvalidPropertyAssignmentValue + */ + $metadata->fieldMappings['roles']['type'] = 'array'; + } +} diff --git a/src/Resources/config/doctrine/BaseUser.orm.xml b/src/Resources/config/doctrine/BaseUser.orm.xml index 92ae3d230..11d5ec41f 100644 --- a/src/Resources/config/doctrine/BaseUser.orm.xml +++ b/src/Resources/config/doctrine/BaseUser.orm.xml @@ -11,7 +11,7 @@ - + diff --git a/src/Resources/config/doctrine/BaseUser3.orm.xml b/src/Resources/config/doctrine/BaseUser3.orm.xml deleted file mode 100644 index 6ebf323c6..000000000 --- a/src/Resources/config/doctrine/BaseUser3.orm.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Resources/config/orm.php b/src/Resources/config/orm.php index ed65e6768..1c1c04983 100644 --- a/src/Resources/config/orm.php +++ b/src/Resources/config/orm.php @@ -14,6 +14,7 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator; use Sonata\UserBundle\Entity\UserManager; +use Sonata\UserBundle\Listener\DoctrineMappingListener; use Sonata\UserBundle\Listener\UserListener; return static function (ContainerConfigurator $containerConfigurator): void { @@ -37,5 +38,13 @@ ->args([ service('sonata.user.util.canonical_fields_updater'), service('sonata.user.manager.user'), + ]) + + ->set('sonata.user.doctrine.mapping_listener', DoctrineMappingListener::class) + ->tag('doctrine.event_listener', [ + 'event' => 'loadClassMetadata', + ]) + ->args([ + param('sonata.user.user.class'), ]); };