diff --git a/CHANGELOG.md b/CHANGELOG.md index 8859f5dd77..26de99e3ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ a release. --- ## [Unreleased] +- Blameable: Added UUID in allowed types list for Blameable fields in Annotation ## [3.15.0] ### Added diff --git a/composer.json b/composer.json index 4799df4206..da77e75e75 100644 --- a/composer.json +++ b/composer.json @@ -67,6 +67,7 @@ "rector/rector": "^0.19", "symfony/console": "^5.4 || ^6.0 || ^7.0", "symfony/phpunit-bridge": "^6.0 || ^7.0", + "symfony/uid": "^5.4 || ^6.0 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "conflict": { diff --git a/src/Blameable/Mapping/Driver/Annotation.php b/src/Blameable/Mapping/Driver/Annotation.php index 6bde2d0d41..57fcce9e52 100644 --- a/src/Blameable/Mapping/Driver/Annotation.php +++ b/src/Blameable/Mapping/Driver/Annotation.php @@ -39,6 +39,8 @@ class Annotation extends AbstractAnnotationDriver 'one', 'string', 'int', + 'ulid', + 'uuid', ]; public function readExtendedMetadata($meta, array &$config) diff --git a/src/Blameable/Mapping/Driver/Xml.php b/src/Blameable/Mapping/Driver/Xml.php index da2f423e32..42861f8e17 100644 --- a/src/Blameable/Mapping/Driver/Xml.php +++ b/src/Blameable/Mapping/Driver/Xml.php @@ -34,6 +34,8 @@ class Xml extends BaseXml 'one', 'string', 'int', + 'ulid', + 'uuid', ]; public function readExtendedMetadata($meta, array &$config) diff --git a/src/Blameable/Mapping/Driver/Yaml.php b/src/Blameable/Mapping/Driver/Yaml.php index 21971d343d..e72b334890 100644 --- a/src/Blameable/Mapping/Driver/Yaml.php +++ b/src/Blameable/Mapping/Driver/Yaml.php @@ -37,6 +37,8 @@ class Yaml extends File implements Driver 'one', 'string', 'int', + 'ulid', + 'uuid', ]; /** diff --git a/tests/Gedmo/Blameable/BlameableUuidTest.php b/tests/Gedmo/Blameable/BlameableUuidTest.php new file mode 100644 index 0000000000..1e0de8b576 --- /dev/null +++ b/tests/Gedmo/Blameable/BlameableUuidTest.php @@ -0,0 +1,70 @@ + http://www.gediminasm.org + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Gedmo\Tests\Blameable; + +use Doctrine\Common\EventManager; +use Gedmo\Blameable\Blameable; +use Gedmo\Blameable\BlameableListener; +use Gedmo\Tests\Blameable\Fixture\Entity\Company; +use Gedmo\Tests\Tool\BaseTestCaseORM; +use Symfony\Component\Uid\Uuid; +use Symfony\Component\Uid\UuidV6; + +final class BlameableUuidTest extends BaseTestCaseORM +{ + private const COMPANY = Company::class; + + private UuidV6 $uuid; + + protected function setUp(): void + { + parent::setUp(); + + $this->uuid = Uuid::v6(); + + $listener = new BlameableListener(); + $listener->setUserValue($this->uuid); + + $evm = new EventManager(); + $evm->addEventSubscriber($listener); + + $this->getDefaultMockSqliteEntityManager($evm); + } + + public function testBlameableUuid(): void + { + $company = new Company(); + $company->setName('ACME'); + + self::assertInstanceOf(Blameable::class, $company); + + $this->em->persist($company); + $this->em->flush(); + $this->em->clear(); + + /** + * @var Company $foundCompany + */ + $foundCompany = $this->em->getRepository(self::COMPANY)->findOneBy(['name' => 'ACME']); + $created = $foundCompany->getCreated(); + $createdUuid = $created instanceof Uuid ? $created->toRfc4122() : null; + + self::assertSame($this->uuid->toRfc4122(), $createdUuid); + } + + protected function getUsedEntityFixtures(): array + { + return [ + self::COMPANY, + ]; + } +} diff --git a/tests/Gedmo/Blameable/Fixture/Entity/Company.php b/tests/Gedmo/Blameable/Fixture/Entity/Company.php new file mode 100644 index 0000000000..bfac50eabd --- /dev/null +++ b/tests/Gedmo/Blameable/Fixture/Entity/Company.php @@ -0,0 +1,81 @@ + http://www.gediminasm.org + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Gedmo\Tests\Blameable\Fixture\Entity; + +use Doctrine\DBAL\Types\Types; +use Doctrine\ORM\Mapping as ORM; +use Gedmo\Blameable\Blameable; +use Gedmo\Mapping\Annotation as Gedmo; +use Symfony\Component\Uid\Uuid; +use Symfony\Component\Uid\UuidV6; + +/** + * @ORM\Entity + */ +#[ORM\Entity] +class Company implements Blameable +{ + /** + * @var int|null + * + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: Types::INTEGER)] + private $id; + + /** + * @var string|null + * + * @ORM\Column(name="name", type="string", length=128) + */ + #[ORM\Column(name: 'name', type: Types::STRING, length: 128)] + private $name; + + /** + * @var UuidV6|null + * + * @Gedmo\Blameable(on="create") + * @ORM\Column(name="created", type="uuid") + */ + #[ORM\Column(name: 'created', type: 'uuid')] + #[Gedmo\Blameable(on: 'create')] + private $created; + + public function getId(): ?int + { + return $this->id; + } + + public function setName(?string $name): void + { + $this->name = $name; + } + + public function getName(): ?string + { + return $this->name; + } + + public function getCreated(): ?Uuid + { + return $this->created; + } + + public function setCreated(?UuidV6 $created): void + { + $this->created = $created; + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 10ed598853..20658670a1 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -11,7 +11,9 @@ use Doctrine\Common\Annotations\AnnotationReader; use Doctrine\Common\Annotations\PsrCachedReader; +use Doctrine\DBAL\Types\Type; use Symfony\Component\Cache\Adapter\ArrayAdapter; +use Symfony\Bridge\Doctrine\Types\UuidType; /* * This is bootstrap for phpUnit unit tests, @@ -30,3 +32,5 @@ $reader = new AnnotationReader(); $reader = new PsrCachedReader($reader, new ArrayAdapter()); $_ENV['annotation_reader'] = $reader; + +Type::addType('uuid', UuidType::class);