-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Necessary refactorings for Property hooks #11659
base: 3.4.x
Are you sure you want to change the base?
Conversation
What are the consequences for the persistence reflection namespace, and for the ODM? I suppose if there is code in persistence, it is because it is shared with the ODM? |
@greg0ire for now its just inline because this way its easier to test the changes fully without multi component changes. We can move the PropertyAccessors namespace into persistence if we think that will help for MongoDB. |
Should all the PropertyAccessor types be marked as internal so that moving them doesn't become a breaking change? |
…ternal reflection properties. no tests.
…ccessors at runtime.
…ort for lazy objects.
ee39bd0
to
238fb74
Compare
if ($mapping->enumType !== null) { | ||
$accessor = new EnumPropertyAccessor( | ||
$accessor, | ||
$mapping->enumType, | ||
); | ||
} | ||
|
||
$this->reflFields[$field] = new ReflectionEmbeddedProperty( | ||
$parentReflFields[$mapping->declaredField], | ||
$childProperty, | ||
$this->propertyAccessors[$field] = new EmbeddablePropertyAccessor( | ||
$parentAccessors[$mapping->declaredField], | ||
$accessor, | ||
$mapping->originalClass, | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not necessarily in scope of this PR, but I'd expect that a factory would also handle the creation of EnumPropertyAccessor
and EmbeddablePropertyAccessor
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is a reason I did it this way:
The code in the factory is what was copy adapted from doctrine/persistence, and the enum and embeddable accessors are originally from the ORM code as well. Mixing them in a factory, when we potentially move part of that code out back into persistece library at some point could prove problematic.
@@ -470,7 +470,7 @@ public static function provideCardClasses(): iterable | |||
public function testItAllowsReadingAttributes(): void | |||
{ | |||
$metadata = $this->_em->getClassMetadata(Card::class); | |||
$property = $metadata->getReflectionProperty('suit'); | |||
$property = $metadata->reflFields['suit']; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't we expect/assert here a deprecation trigger?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I didnt pay much attention to this change, but developers downstream (like this test simulates looking at the referenced PR) might want to still access the original reflector.
tests/Tests/ORM/Mapping/PropertyAccessors/ReadOnlyAccessorTest.php
Outdated
Show resolved
Hide resolved
Co-authored-by: Claudio Zizza <[email protected]>
….php Co-authored-by: Claudio Zizza <[email protected]>
This prepares the internals of
ClassMetadata
to go away from$reflFields
as an array of ReflectionProperty and sub-classes. This is problematic in PHP 8.4, because we need to usesetRawValueWithoutLazyInitialization
andgetRawValue
instead. In the existing inheritance heirachy this is going to be messy.This PR inlines the Persistence Reflection namespace into a new PropertyAccessors namespace and reworks the API to be wrappers of ReflectionProperty (aggregation) instead of inheritance. It also cleans up the code to avoid the references to old Doctrine proxy instances. You can access the new API via
ClassMetadata::$propertyAccessors
.The
PropertyAccessor
interface has just two methods:For backwards compatibility
ClassMetadata::$reflFields
is converted from array to a newLegacyReflectionFields
class that maps from property accessors to persistence-based reflection property instances. Accessing this structure emits a deprecation.Tasks
The actual support for property hooks should be done after this is merged in a seprate PR.