We've long desired the ability for core to easily produce a "correct" schema for a given entity type/bundle. The concept of "schematic" normalizers will get us closer.
While this issue/concept was originally blocked by an inability to cache the outcome of a "supports" query on a normalizer, that was fixed in #3252872: Use CacheableSupportsMethodInterface for performance improvement in normalizers thanks in large part to changes upstream in Symfony.
Proposed Solution (originally authored by @gabesullice):
Add a SchematicNormalizerInterface
with a ::getNormalizationSchema()
method.
Initial thoughts on a method signature:
$type
is a supported interface or class.$format
is the encoding format.$refinements
is a parameter bag of anything that is required to return a correct schema. For example,ResourceObjectNormalizer::getNormalizationSchema()
would need$refinements->get('resource_type')
. Best practice would be for refinements to be documented on the method and then asserted in the method. It's imperfect, but the best I can think of.
I think under this system, every normalizer would be required to return a complete schema. Meaning that the JsonApiDocumentTopLevelNormalizer
would be responsible for returning a schema that included schema for any child resource object(s). Alternatively, we could allow normalizers to return placeholder objects and resolve them separately. That might end up as an over-engineered solution though.
Finally, I think that we would put this method on the Serializer
service so that normalizers will not need to specifically know which child normalizer services will be applied.