Problem/Motivation
Resource types don't have a uniform API to extract information about their fields. That information is scattered across different services like:
- Resource Type: contains the information about the relatable resource types for all possible fields, information about aliases, and if a field is enabled or not.
- Resource Type Repository: computes the information stored in the resource type. This makes sense for relatable resource types because some computations can be easily shared across resource types, but not for all.
- Entity API: all the information about fields in configuration entities is accessed at the Entity API level.
- Field API: all the information about fields in content entities is accessed at the Field API level.
Proposed resolution
A resource type should be aware of the fields that it contains. We should think about this in terms of the specification. The spec talks about the fields of a resource type, but we don't have an easy way to get the fields of a resource type.
Introduce 3 classes:
ResourceTypeField: abstract base class for either attribute or relationship fieldsResourceTypeAttribute: concrete specialization of a ResourceTypeField for resource type attributesResourceTypeRelationship: concrete specialization of a ResourceTypeField for resource type relationships. It stores a list of the "relatable" resource types for its particular relationship. This data is currently on theResourceTypeclass and this issue will move it down to the field level (while preserving the internal API)
Each one of these contains information about the: entity defined field name, the field alias (aka public field), if the field is enabled or not, the field item data type (will become useful in the future*). Relationships will also contain info about the relatable resource types.
API changes
None in this issue. Consider this a refactoring of the $field_mapping argument to ResourceType::__construct() that adds additional safety and structure.
Followups will create two new methods on the ResourceType will contain two new methods (on an internal class):
ResourceType::getFields() -> ResourceTypeField[]ResourceType::getFieldByName($alias) -> ResourceTypeField
And then add a ResourceTypeField::hasOne() method so the field "knows" whether it has cardinality > 1 or not.
For now this is only an internal refactoring, but it paves the path for #3014283: Use ResourceTypeFields to statically determine the field normalizer.
| Comment | File | Size | Author |
|---|---|---|---|
| #78 | 3014277--error-on-update--78.patch | 899 bytes | e0ipso |
| #74 | 3014277-74.patch | 59.3 KB | gabesullice |
Comments
Comment #2
e0ipsoComment #3
e0ipsoComment #4
e0ipsoThis patch won't work, but it highlights the direction I'm going. It lacks a good solution for config entities, given that they don't have field definitions.
Comment #5
e0ipsoComment #7
wim leersThanks for laying out the proposal so clearly in the issue summary! I was able to instantly grok where you were going with this :)
I like this a lot!
NullResourceFieldDefinition?I think that not passing Drupal's Field API's
FieldDefinitionInterfaceobjects into theResourceTypeconstructor (and then calling this protectedcreateResourceField()for each of them), but instead passing theResource(Attribute|Relationship)Definitionvalue objects into the constructor would also solve the problem you highlighted:Because then the
ResourceTypeobject remains a simple, dumb value object. With no logic. With only metadata. The complexity would then continue to live inResourceTypeRepository. Just like it already does for computing the relatable resource types, it could also contain this mapping logic, including that for config entity types.Great first iteration! 👌 I'm excited to see where you'll take this! This feels like the next logical step after #2977669: Spec Compliance: some entity types have an "id", "type" or "uuid" field, this violates the spec.
Comment #8
wim leersI'm not sure this is a , this seems more like a ? It doesn't bring new features, it's about refactoring internals.
Comment #9
wim leersAFAICT this is a hard blocker for #3014283: Use ResourceTypeFields to statically determine the field normalizer?
Comment #10
e0ipsoYou are correct.
Comment #11
wim leers👍 Looking forward to this getting in! 😀
Comment #12
e0ipsoLooking into picking this back up really soon.
Comment #13
e0ipsoComment #14
wim leers🎉
Comment #15
gabesulliceLooks cool! I see how this will be necessary. I'm a little worried about config entities since they don't have fields and because it's impossible to figure out what properties exist without having an instance of that config entity in hand.
I'm reviewing this mostly because I want to see how it would interact with #3015438: Wrap entity objects in a ResourceObject which carries a ResourceType. And there's good news, it won't. This patch isn't removing or changing and of the methods available on the
ResourceTypeobject. That was even more of a pleasant surprise because I assumed this would need to refactorRoutes.php.I like the idea of giving the
ResourceTypeobject a richer understanding of its fields. Field mappings have become quite complex and we've shoved a lot of information into a simple indexed array and overloaded the meaning ofNULLandFALSEin the field mapping to mean various things.I think I feel the same as @Wim Leers does in #7 about not moving the field mapping stuff out of
ResourceTypeRepository. What does that buy us? Are we missing something?The purpose of this is not clear to me.
Should this interface have
isEnabled()too?Let's stick with the names we use everywhere else: "public" & "internal".
Why have interfaces for these? If these are pure value objects, it seems unnecessary.
Would
getCardinalitybe better here? Perhaps not, that's a Drupal thing. This will really only inform whether an array orNULLis appropriate when normalizing empty fields.Ubernit: drop the
fieldsdirectory.Nit: I think a better name for this is just
FieldType, mirroringResourceType. "Resource" is already implied by its namespace.Could this be turned into
withRelatableResourceTypesand return a new instance of itself, making the object immutable?Comment #16
e0ipsoI'm not sure I see the gain with these pure value objects. I'm probably missing something incredibly obvious. Pushing all the code that naturally belongs to the
ResourceTypeto theResourceTypeRepositorywhile passing$resource_typealways felt a bit awkward.It's nice to have a simple way to type hint a polymorphic set. In other words, for ergonomics.
Comment #17
wim leersRebased #4 on HEAD.
Comment #18
wim leers(I did #17's rebase to ensure that @gabesullice's analysis in #15 is still accurate: that they don't conflict. Happy to report this is still true! This even applies cleanly to both HEAD and HEAD+#3015438: Wrap entity objects in a ResourceObject which carries a ResourceType!)
Comment #20
e0ipsoI made significant progress on this. This is instrumental to schema support in the jsonapi_schema PoC.
This is not ready, but I'd love to hear feedback about the direction and implementation. I'm not ready for naming and documentation nits atm, I'm ready for the rest.
Comment #21
e0ipsoComment #22
e0ipsoI added some necessary methods and applied some fixes.
Comment #23
gabesulliceI know you said you're not ready for naming nits, but I'll forget this if I don't say it now:
The spec's language for this is "has-one" vs "has-many". So, maybe
s/isMultiple/hasMany?❤️ this will make it very easy to experiment in contrib by overriding this bit of the factory. I might go a step further and add
createAttributeandcreateRelationshipso that their operations could be more granularly tweaked.This feels like a premature optimization and I think because of the performance/cacheing work we've already done WRT to the resource type repository it won't have much of an effect. The field manager already has its own caching anyway.
Why use a setter for cardinality and nothing else? This feels like it's an accommodation for some other module in the ecosystem. If that's case, could that module override the
createmethod instead of using this setter?I don't think that these methods should be part of this patch. I know that it's necessary for jsonapi_schema, but I don't think that's fleshed out enough to justify them. F.E. why shouldn't this be
getSchemaandsetSchema? What other purpose would knowing the data definition have?Couldn't we extend/decorate this class and experiment with what this method should be in contrib thanks to the factory?
I still think moving the field derivation into the
ResourceTypeclass seems icky. Perhaps you're concerned about adding even more bloat to theResourceTypeRepository? If that's the case, maybe we need aResourceTypeFactorytoo. I'd be open to that change as a precursor issue or followup.What's this file for?
I'm definitely +1 to adding an object that'll capture more information about a resource type's fields.
I expected to see some changes/simplifications elsewhere in JSON:API thanks to this. For example, in
EntityResource::addToRelationshipDatawe have all this that could be simplified:Comment #24
e0ipso$is_referenceparam aims for that. Would you drop it in favor of these additional 2 methods instead? I'd rather keep it simple.TypedResourceFieldInterfaceobjects. But I do think that JSON:API should not couple unnecessarily with the JSON Schema spec, that'd be OK for Extras I think.ResourceFieldsbelong toResourceTypeshence it's appropriate to have those operations there. In fact unless there are cross-resource interactions (like relatables) it's more appropriate. Maybe that'd be clearer if we renamed toResourceFieldDefinitionInterfaceinstead. We could keep theResourceTypeas a value object if we add that factory/compiler you propose, however I can't see the value of it.Definitely, all that is still missing. I'd like to defer to a follow up so the patch is not so big. This issue should add the plumbing for that to happen.
Comment #25
gabesullice1. Touché ✅
2. I was actually thinking of having all three. Then an extender could override to affect either type, or just one, without caring about the logic. Minor suggestion, not a blocker.
3. 👍 ✅
4. 👍 ✅
5. I'm okay with the coupling happening outside of core for now. There's some renewed discussion about making JSON:API recognize JSON-Schema, at which point I think it'd be safe to move into core. ✅
6. I don't think changing the name helps much. It feels weird to me to have so much logic happening in the construction of the class. It also forces this static service call:
$resource_field_factory = \Drupal::service('jsonapi.resource_field.factory');. It seems like a factory is designed to solve this problem exactly.7. I figured, thanks for confirming :) ✅
This interdiff addresses items with a green checkmark above. I also went ahead and addressed some small nits in the interest of saving time, like renaming
getAliastogetPublicFieldNameto match the language used everywhere else.Comment #26
gabesullice@e0ipso, I think I might have come up with a compromise after your comment in #24.6. This moves the logic into the resource field factory. I think this gets to your point about the logic not belonging to the repository while keeping the resource type a value object. WDYT?
P.S. There's also some cleanup of
ResourceTypeto account for the new "smarter" fields. I think there's a lot of room for improvement/simplification in the code that we're talking about in 24.6 because of those same "smarts". I didn't make those yet in order to keep changes minimal, but we could make them in a subsequent interdiff if you're on board with this compromise.Comment #27
gabesulliceWhoops, I forgot one commit in the last interdiff.
Comment #28
e0ipsoI'm cool with the changes, although I don't like losing the hierarchical approach of
ResourceTypeRepository➡️ResourceType➡️ResourceFieldInterface, which feels natural to me.In any case, I'm good with the changes ✅
For clarity of intentions:
$entity_type, $bundle, $field_nameshould eventually be moved to the resource fields.ResourceFieldDefinitionInterface,ResourceAttributeDefinition, etc. The current naming may not be clear that these objects do not carry actual field data in themI still would like to see an explanation about the desire to keep
ResourceTypeas a value object. I can't see a benefit that is really obvious to others.Comment #29
ndobromirov commentedAs far as I recall it allowed for an easy persistent caching of the resource types as implemented here: #3018287: ResourceTypeRepository computes ResourceType value objects on *every request*. Still not committed though.
Comment #30
e0ipso#29 you can still serialize & cache objects if they have methods with logic in them (in fact the serialization would be exactly the same). Even if we inject services to it we can add the
DependencySerializationTraitfor that.That's why I suspect that there may be additional reasons.
Comment #31
gabesullice#28:
1. Can you expand on that with an example?
2. I agree that the names should be changed. I'm hesitant to use the word
Definitionbecause it reminds me too much of the fields and TypedData system. What aboutResourceTypeAttributeandResourceTypeRelationship?\It's not really about it being a value object. Even with the changes you made,
ResourceTypewas still a value object. Once it was instantiated, its values didn't change and none of its getters would return different results based on external state.My objection centers around how that pattern tightly couples construction of the
ResourceTypevalue object to the Entity and Field API and that it requires statically accessing any services we need. Those two things make our code difficult to adapt and extend.Let's imagine that we want JSON:API Extras to be able to add synthetic relationship definitions and that those synthetic relationships could be created as a plugin. The pattern of deriving
ResourceFields duringResourceTypeconstruction would mean that Extras's only option would be to extend and overrideResourceType. Then, it'd have to add another static call like$relationship_plugin_manager = \Drupal::service('jsonapi_extras.sythetic_field.manager) somewhere, which would be called every time a newResourceTypewas constructed. That's a little smelly on its own, but not terrible. The real difficulty comes from the fact that it would create a mutually exclusive class hierarchy. If another module wants to add support for an entity reference-like field (maybe DER or ERR) that JSON:API has trouble recognizing today, that module couldn't be installed in concert with JSON:API Extras.In contrast,
ResourceFieldFactory::createResourceFields()is trivial to decorate and permits any number of modules or systems to add their own fields without fussing about a class hierarchy:Comment #32
e0ipsoAh, yeah I'm good with having a separate service to deal with all that. I see your reasoning, I don't fully agree (in your example JSON:API Extras could decorate
ResourceTypeto avoid the inheritance mess) but I don't want to digress in this lateral thing.Thanks for speaking about this! I think we can now focus on moving this issue forward (in which we agree 99%).
Comment #33
jibranDo we need a change record for this issue?
Comment #34
e0ipso@jibran we are only changing internal plumbing so I don't think it's strictly necessary. I'm not opposed to adding one if others feel it's necessary though.
Comment #35
e0ipsoAfter trying to use #27 in JSON:API Schema I ran into several missing bits.
ResourceAttributetoResourceTypeAttributeas mentioned above. I still like having the wordDefinitionbetter, but I don't want to spend time in naming discussions 😛Comment #36
e0ipsoFixed a typo in an interface name.
Comment #37
gabesulliceThis issue has been stagnant for too long! This functionality is a necessary component for JSON:API Schema. It's not for lack of enthusiasm that I haven't helped push this issue forward more quickly. After doing some reflection, I think the reason I haven't given it the attention it deserves is because I was a bit afraid of it. I had to take a moment and ask myself why.
I think it's because it's moving a lot of code around and introducing new concepts and internal APIs all at once. Lord knows I've been guilty of this myself in the past. I'm sorry for that.
So, how do we get this moving again and how do we accelerate that movement?
I think we need to break this down into more digestible pieces and commit them serially.
$field_mappingargument toResourceType::__constructin a "pure" refactoring. There should be nothing new here.isMultiple) to the field objects.getResourceFields()andgetResourceFieldByName($alias)methods.I've written a patch for #1 with tests and comments. I think it's pretty much ready to go as-is. It'll require a followup in Extras because of the
getFieldMapping => getFieldschange. I'll write that if and as soon as @e0ipso gives his blessing to this proposed plan. The same goes for creating the other issues.No interdiff because it'd just be more confusing.
I'm marking this as a task because the patch is just a refactoring, not a new feature. Moving to the core queue for this patch.
Comment #38
gabesulliceWe probably don't want to lose this. Brought it back (in a different, more appropriate place now).
Moved the
ifstatement to a ternary cause it was bothering me.This change is the essence of this patch.
Comment #40
gabesulliceAh, automated tests catch my sloppiness again lol. Fixed #38.
Comment #41
wim leersWow, a lot happened since I last looked at this issue!
#37: this looks great! 👍 I wonder though if steps 2 and 3 should not also happen in this issue? I do think it makes sense to keep step 4 for a separate issue, because #37 demonstrates that this factory is not necessary. That means the reason for adding it must be that we want to add it to accommodate other modules, which would probably have to be a public API per #3032787: [META] Start creating the public PHP API of the JSON:API module.
Comment #42
gabesulliceI'm fine incorporating 2 & 3 if you think the extra code won't impede the patch. My thinking was that it'd be easier to land this as a clean refactoring. Then, for 2 & 3, we'd have the opportunity to refactor other bits of the codebase so we'd have the chance to actually use the new methods. Otherwise, we're just adding them without a usage and we'll have a refactor patch later anyway, unless we grow this patch bigger than #36 to also make use of the methods.
Comment #43
wim leers@e0ipso and @gabesullice discussed this in detail in person at DecoupledDays yesterday. They agreed about next steps. Let's document that agreement so that we don't forget about the details of it.
Comment #44
gabesulliceAs I remember it, @e0ipso and I agreed that this lowered scope patch was okay if we were sure that we'd do the followups. The primary requirement of the followups is to enable JSON:API Schema to do its job, which is in fact my main reason for working on all of this. I'm committed to pushing forward and landing everything necessary for JSON:API Schema so that it can get a stable release.
Comment #45
wim leersExcellent. It may be helpful if you could post interdiffs for both steps 2 and 3. That would then allow a core committer to assess whether they want to include this in this patch like I suggested in #41 or not.
Comment #46
gabesulliceHere's the interdiff for step 3. Posting it here so tests can run while I work on step 2.
Comment #47
e0ipsoThis is very close. I am OK splitting this in as many parts as necessary as long as all of it gets committed. That is, if that eases the core committer review work.
A couple of nits and questions.
I wish one of the Util classes had a
Util::curriedMethodfunction.That would allow cleaner
array_map.Übernit, lets pipe
array_filterwitharray_reduce.Worth adding a TODO to the follow up issue that will introduce the field getter.
I think it is appropriate to have it abstract because according to the spec this can only be attribute or relationship.
Why a factory instead of a setter?
Same question about factory vs setter.
Same question about factory vs setter.
Do you think this is a good candidate for the null pattern?
Übernit: can we break this in multiple lines or multiple variables?
Comment #48
gabesulliceWhoa, thanks for the review @e0ipso! I'll address all that early Monday.
Here are files for steps 2 and 3.
In doing step 2, I realized it will depend on step 3. So we'll have to reverse the order of commit (unless they're all committed at once ofc!)
I made a change to the step 3 patch, I attached an interdiff for that too.
Comment #49
gabesulliceBefore addressing #47 I'd like to get everything back to green.
3014277-48-with-get-fields-method.patchmostly fails because I forgot to add auseline to my commit. That line was added to the "with-both" patch, which is why it has so many fewer failures.3014277-48-with-both.patchprimary fails because of new required set-up inEntityResourceTest(this is pretty much the case for every meaningful change 😞)The primary patch is unchanged.
On to addressing @e0ipso's review!
Comment #50
gabesulliceOkay, finally ready to post patches for @e0ipso's review. I found (and fixed) an existing bug that was revealed by
3014277-49-with-get-fields-method.patch. I fixed a piece of it in the step-2 interdiff, not realizing it was a more widely spread problem (i.e. CRUD on relationship routes does not correctly support field aliasing), which is why the with-both patch succeeds but the with-get-fields-method does not. I've updatedinterdiff-step-3-get-fields-method.txtto include that fix.Now for @e0ipso's review...
1. That'd be nice! The only drawback is that you have to put a method name in as a string, which would break most static analysis tools and things like "go to method". It'd be really nice if PHP treated methods as values like JS does. Then you could do
Util::curriedMethod(MyClass::method), passing the method as a "real" argument.2. A man after my own heart. Done.
3. You posted this before I posted the interdiffs for steps 2 and 3. Normally I'd agree, but since those patches are already "done", I think adding this todo would be extra process + work.
4. 👍
5. I like this pattern because it keeps the object immutable. I also think it lends itself nicely to resource type repository decoration:
6. Same as 5.
7. Again, for the immutable pattern.
8. I thought about this too but elected against it. I couldn't come up with a good reason that there should be
ResourceTypeOmittedFieldbut notResourceTypeSingleFieldorResourceTypeMultipleFieldother than because "null" ~= "omitted/disabled". Then I realized that the null pattern makes lots of sense for things that are meant to be values, but not things that define those values. IOW,OmittedResourceObjectmakes sense butOmittedResourceTypedoes not. Also, sinceResourceTypeFieldsare immutable, I think there's a little less need for the null pattern again.9. Absolutely! Done.
Comment #51
gabesulliceWhoops, here's the interdiff specific to @e0ipso's review.
Comment #52
e0ipsoEverything in #50 sounds reasonable.
Comment #53
gabesulliceThanks @e0ipso!
I updated the issue summary.
To recap for any further reviewers/committers...
There are lots of files in #50. The original patch was doing a lot. In #37 I wrote a new patch with a smaller scope because I thought it would make it easier and quicker to get it to RTBC. That patch has reached RTBC per #52 (
3014277-50.patch). I proposed that after it landed, we could have 3 followups:@Wim Leers and @e0ipso thought that perhaps you (the committer reviewing this) would prefer to have steps 2 and 3 as part of this patch. So I began working on those as well. I discovered that step 2 actually depends on step 3. So the order of those will need to be reversed or they should be committed together. I haven't changed the original numbering so as not to create additional confusion.
Because we wanted to keep all options open, there are a number of files attached to #50. I'll briefly describe each one:
interdiff-step-3-get-fields-method.txt: This would be the patch for the first followup that would introduce methods on theResourceTypeclass to make the fields accessible.interdiff-step-2-cardinality-method.txt: This would be the patch for the second followup that would introduce a concept of cardinality to the fields.3014277-50-with-get-fields-method.patch: If you (the committer) feels the first followup could be committed together with this patch, this would be the combined patch.3014277-50-with-both.patch: If you (the committer) feels the first & second followups could be committed together with this patch, this would be the combined patch (the second followup can't be committed without the first).3014277-50.patch: This is the primary patch for this issue. It only covers the reduced scope that I proposed in #37 in order to make it easier to review and so that its followups would be smaller/easier to review as well.Comment #54
larowlanI like the move to a more explicit API/data structure for this.
My only question is about the BC breaks.
Yes, I know the classes are internal, but for things like service constructors and plugin constructors we've been trying to ease the burden of minor updates by providing a BC layer, even though we're not obligated to. Do you think we should do the same here?
As we're removing these, should we provide a __get implementation that triggers a deprecation error if a sub-class tries to access these fields and then provides a fallback using the new API? That's the way we've typically removed properties in other sub-systems in a BC fashion
while we're touching these lines, I guess we could use the null coalesce operator now.
should we be checking the type of the values in $fields argument in case a sub-class is passing the old value - we typically do this for constructor changes. If we find the wrong argument is being passed, we trigger_error and use the \Drupal singleton or similar to get the correct value
is it worth statically caching/calculating this when ::setRelatableResourceTypes is called
we could use null coalesce here too
should we be triggering an error here for sub-classes? the fact we have two sub-classes in core makes me think that custom/contrib code may also extend it (even though its internal code). should we try and prevent hard-breaks for those folks?
Comment #55
gabesulliceThanks for the review @larowlan!
JSON:API is littered with warnings about the fact that none of its PHP is to be considered BC-safe.
Given that:
ResourceType) and its factory (ResourceTypeRepository) as opposed to a plugin system (this design was specifically chosen to dissuade people from trying to alter them as they might alter plugins)ResourceTypeRepositorywould provide (#3032787: [META] Start creating the public PHP API of the JSON:API module)I truly don't believe the extra complexity these BC-layers would introduce are worth it.
1. See above.
2. 2. Done! I feel so... liberated! That's the first time I've been able to use null coalesce :D
3. See above.
4. I didn't cache it when
setRelatableResourceTypeswas called to avoid having the LogicException about callingsetRelatableResourceTypesin two different places, but I did cache the first time it gets called.5. ✅
6. See above.
Comment #56
wim leersComment #57
jibranI was about to post something similar as #3070204-22: Refactor the JSON:API FieldResolver to use a resource type instead of an entity type ID and bundle ID pair here but @Wim Leers's reply in #3070204-23: Refactor the JSON:API FieldResolver to use a resource type instead of an entity type ID and bundle ID pair pretty much covers my argument here as well so not having a BC should be fine for this issue.
Comment #58
larowlanFor the BC question
Comment #59
catchOK I've looked over all three issues. In general I think the approach we've taken to adding bc layers to plugin constructors and similar has been good - while we don't have to, the bc layers are simple and easy to maintain in those cases and reduce disruption for contrib.
In this case, the code to maintain a bc layer would be considerably more complex, and the potential surface of people relying on the current behaviour is very small, so I do think it's OK to go ahead without one here. This doesn't mean there won't be other cases where we might want to provide bc though for @internal code if it's easy to do so.
Note I did not do an in-depth review of the patch yet so this shouldn't be taken as one.
Comment #60
alexpottNeeds a reroll.
Comment #61
gabesulliceRerolled.
Comment #63
gabesulliceWhoops, messed that up.
Comment #65
gabesulliceGah, silly mistake. This really should be back to RTBC now.
Comment #66
xjmComment #67
wim leersClarification: this blocks https://www.drupal.org/project/jsonapi_schema.
Comment #68
xjmBumping to major since this is a contrib blocker. Thanks!
Comment #69
larowlanReview credits
Comment #70
larowlanThis needs to link to a change record - which we don't have yet - can you add that and update this error?
Please put straight back to RTBC, I will keep an eye out for the issue.
Same here too, thanks
Comment #71
gabesulliceCRs created:
Thanks @larowlan!
Comment #72
e0ipsoW00t! So close. Once this is in there will only be one blocker for JSON:API Schema (which is instrumental for the #1 priority of the initiative, the JSON:API Explorer).
Comment #73
larowlanDoesn't apply after #3036285: Add a \JsonApiResource\Relationship object to carry relationship data, metadata and a link collection. - but also - the
trigger_errorin the code needs to use the CR links, not this issue link.Needs work for both of those.
Comment #74
gabesulliceAh, I didn't know about that practice. TIL.
Rerolled and made the
trigger_errorchange per #73.Comment #75
larowlanCommitted 7dfe387 and pushed to 8.8.x. Thanks!
Fixed on commit
Published both change records 😎
Comment #77
jibranShould these all not point to https://www.drupal.org/node/3084746?
Comment #78
e0ipsoI ran into an issue when updating my local to
8.8.xwhen trying to bring this in.Comment #79
larowlanI think that indicates we're missing test coverage - should we roll this back?
Comment #80
jibranI'd say let's create a followup as it is unblocking a bunch of issues.
Comment #81
gabesullice+1 to what @jibran said. The error @e0ipso found is in the BC-layer on the internal ResourceType. I guess it's probably JSON:API Extras that's involved. I'll open a follow-up where we can find a good way to test it.
Comment #82
gabesulliceDone: #3085885: Follow-up to #3014277: Wrong variable used as argument in BC layer-providing ResourceType::updateDeprecatedFieldMapping()
Comment #83
wim leersRestoring status per @jibran & @gabesullice. See y'all in #3085885: Follow-up to #3014277: Wrong variable used as argument in BC layer-providing ResourceType::updateDeprecatedFieldMapping().
Comment #84
gabesullice#77: @jibran, I don't think so. One is a deprecation on accessing internal properties, the other is a deprecation for constructing a resource type with an outdated argument.