-
-
Notifications
You must be signed in to change notification settings - Fork 9.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
[Serializer] Support serialized names and paths configuration per group #58236
base: 7.2
Are you sure you want to change the base?
[Serializer] Support serialized names and paths configuration per group #58236
Conversation
Hey! I see that this is your first PR. That is great! Welcome! Symfony has a contribution guide which I suggest you to read. In short:
Review the GitHub status checks of your pull request and try to solve the reported issues. If some tests are failing, try to see if they are failing because of this change. When two Symfony core team members approve this change, it will be merged and you will become an official Symfony contributor! I am going to sit back now and wait for the reviews. Cheers! Carsonbot |
*/ | ||
public function __construct(string $serializedPath) | ||
public function __construct(string $serializedPath, string|array $groups = []) |
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.
public function __construct(string $serializedPath, string|array $groups = []) | |
public function __construct(string $serializedPath, string|array $groups = ['*']) |
And then we can check that $groups
is not empty
(same for SerializedName
)
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.
What should we do in case $groups
is empty? Throw exception or fall back to ['*']
?
(BTW, I've implemented second option).
@@ -204,6 +204,16 @@ private function loadAttributes(\ReflectionMethod|\ReflectionClass|\ReflectionPr | |||
} | |||
} | |||
|
|||
private function setAttributeSerializedNameForGroups(SerializedName $annotation, AttributeMetadataInterface $attributeMetadata): void |
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.
private function setAttributeSerializedNameForGroups(SerializedName $annotation, AttributeMetadataInterface $attributeMetadata): void | |
private function setAttributeSerializedNameForGroups(SerializedName $attribute, AttributeMetadataInterface $attributeMetadata): void |
(same for setAttributeSerializedPathForGroups
)
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.
setAttributeContextsForGroups
's corresponding argument still have $annotation
as its name. Do I really need to rename it now?
src/Symfony/Component/Serializer/NameConverter/MetadataAwareNameConverter.php
Show resolved
Hide resolved
…tters and setters
…y in serialized name/path setters
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.
Massive work in this PR, wow 👍 Thank you!
I added some comments
$groups = $line['groups'] ?? []; | ||
|
||
if ($serializedName = $line['serialized_name'] ?? false) { | ||
if (!\is_string($serializedName) || '' === $serializedName) { |
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.
What about ' '
?
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.
Could you please elaborate? Do I need to trim string and then check for emptiness? Or just check for single space? What's the point?
src/Symfony/Component/Serializer/Tests/Mapping/Loader/YamlFileLoaderTest.php
Outdated
Show resolved
Hide resolved
src/Symfony/Component/Serializer/Tests/NameConverter/MetadataAwareNameConverterTest.php
Outdated
Show resolved
Hide resolved
src/Symfony/Component/Serializer/Tests/NameConverter/MetadataAwareNameConverterTest.php
Outdated
Show resolved
Hide resolved
src/Symfony/Component/Serializer/Tests/NameConverter/MetadataAwareNameConverterTest.php
Outdated
Show resolved
Hide resolved
src/Symfony/Component/Serializer/Tests/NameConverter/MetadataAwareNameConverterTest.php
Outdated
Show resolved
Hide resolved
@@ -12,6 +12,7 @@ CHANGELOG | |||
* Add support for configuring multiple serializer instances with different | |||
default contexts, name converters, sets of normalizers and encoders | |||
* Add support for collection profiles of multiple serializer instances | |||
* Support serialized names and paths configuration per group |
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.
* Support serialized names and paths configuration per group | |
* Add support for serialized names and paths configuration per group |
{ | ||
try { | ||
$this->serializedPath = new PropertyPath($serializedPath); | ||
} catch (InvalidPropertyPathException $pathException) { | ||
throw new InvalidArgumentException(\sprintf('Parameter given to "%s" must be a valid property path.', self::class)); | ||
} | ||
|
||
$this->groups = ((array) $groups) ?: ['*']; |
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'm not sure that we must fall back to ['*']
here, maybe an empty array can be valid in some cases (same for SerializedName
)
{ | ||
$this->serializedName = $serializedName; | ||
$groups = 2 <= \func_num_args() ? (func_get_arg(1) ?: ['*']) : ['*']; |
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.
$groups = 2 <= \func_num_args() ? (func_get_arg(1) ?: ['*']) : ['*']; | |
$groups = \func_get_args()[1] ?? ['*']; |
same elsewhere
@@ -21,6 +21,9 @@ | |||
* @internal | |||
* | |||
* @author Kévin Dunglas <[email protected]> | |||
* | |||
* @method string[] getSerializedNames() Gets all the serialized names per group ("*" being the base name applied to all groups). |
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.
* @method string[] getSerializedNames() Gets all the serialized names per group ("*" being the base name applied to all groups). | |
* @method string[] getSerializedNames() Gets all the serialized names per group. |
I'm not sure if we should specify the *
specifics here
* | ||
* @return array<string, string> | ||
*/ | ||
public static function getSerializedNamesFromAttributeMetadata(AttributeMetadataInterface $attributeMetadata): array |
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.
Could you add a description saying that this method is here for BC purposes?
@@ -117,22 +121,22 @@ private function getCacheValueForAttributesMetadata(string $class, array $contex | |||
|
|||
$classMetadata = $this->metadataFactory->getMetadataFor($class); | |||
|
|||
$contextGroups = (array) ($context[AbstractNormalizer::GROUPS] ?? []); |
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.
You might follow #58705, as it might change this part of the code.
At the moment some of my own
MetadataAwareNameConverter
tests are failing. I have tried to fix them, but everything I tried so far breaks existing tests. Just can't figure out what I have to do. Any help would be greatly appreciated!