diff --git a/tests/Tests/Models/PropertyHooks/User.php b/tests/Tests/Models/PropertyHooks/User.php index 101e41b5b3..174589d8fe 100644 --- a/tests/Tests/Models/PropertyHooks/User.php +++ b/tests/Tests/Models/PropertyHooks/User.php @@ -2,10 +2,21 @@ // phpcs:ignoreFile namespace Doctrine\Tests\Models\PropertyHooks; -use DateTime; +use Doctrine\DBAL\Types\Types; +use Doctrine\ORM\Mapping\Column; +use Doctrine\ORM\Mapping\Entity; +use Doctrine\ORM\Mapping\GeneratedValue; +use Doctrine\ORM\Mapping\Id; +use Doctrine\ORM\Mapping\Table; +#[Entity] +#[Table(name: 'property_hooks_user')] class User { + #[Id, GeneratedValue, Column(type: Types::INTEGER)] + public ?int $id; + + #[Column(type: Types::STRING)] public string $first { set { if (strlen($value) === 0) { @@ -15,6 +26,7 @@ class User } } + #[Column(type: Types::STRING)] public string $last { set { if (strlen($value) === 0) { @@ -34,6 +46,7 @@ class User } } + #[Column(type: Types::STRING)] public string $language = 'de' { // Override the "read" action with arbitrary logic. get => strtoupper($this->language); diff --git a/tests/Tests/ORM/Functional/PropertyHooksTest.php b/tests/Tests/ORM/Functional/PropertyHooksTest.php new file mode 100644 index 0000000000..fc9231ee3e --- /dev/null +++ b/tests/Tests/ORM/Functional/PropertyHooksTest.php @@ -0,0 +1,62 @@ += 8.4.0')] +class PropertyHooksTest extends OrmFunctionalTestCase +{ + protected function setUp(): void + { + parent::setUp(); + + $this->createSchemaForModels( + User::class, + ); + } + + public function testMapPropertyHooks(): void + { + $user = new User(); + $user->fullName = 'John Doe'; + $user->language = 'EN'; + + $this->_em->persist($user); + $this->_em->flush(); + $this->_em->clear(); + + $user = $this->_em->find(User::class, $user->id); + + self::assertEquals('John', $user->first); + self::assertEquals('Doe', $user->last); + self::assertEquals('John Doe', $user->fullName); + self::assertEquals('EN', $user->language, 'The property hook uppercases the language.'); + + $language = $this->_em->createQuery('SELECT u.language FROM ' . User::class . ' u WHERE u.id = :id') + ->setParameter('id', $user->id) + ->getSingleScalarResult(); + + $this->assertEquals('en', $language, 'Selecting a field from DQL does not go through the property hook, accessing raw data.'); + } + + public function testTriggerLazyLoadingWhenAccessingPropertyHooks(): void + { + $user = new User(); + $user->fullName = 'Ludwig von Beethoven'; + $user->language = 'DE'; + + $this->_em->persist($user); + $this->_em->flush(); + $this->_em->clear(); + + $user = $this->_em->getReference(User::class, $user->id); + + self::assertEquals('John', $user->first); + self::assertEquals('Doe', $user->last); + self::assertEquals('John Doe', $user->fullName); + self::assertEquals('EN', $user->language, 'The property hook uppercases the language.'); + } +}