Problem/Motivation
This is a followup from #2831274: Bring Media entity module to core as Media module and #2877383: Add action support to Media module.
tstoeckler mentioned in #2831274-41: Bring Media entity module to core as Media module:
One issue in particular from looking at the patch is that I think we should open a parallel issue (or I guess there must be one already) for generic entity actions. There really is nothing media-specific in those action plugins. It would be unfair to block this on that, though.
Currently, the media module and node module implement their own action plugins, even though for some action there is nothing node/media specific happening. It would be nice to have generic entity actions so modules defining custom entities don't have to duplicate the same code over and over.
Proposed resolution
- Discuss which actions should be provided.
- Implement the action plugins.
- Remove the node/media specific plugins.
Remaining tasks
User interface changes
API changes
Data model changes
Comment | File | Size | Author |
---|---|---|---|
#110 | interdiff-2916740-108-110.txt | 924 bytes | chr.fritsch |
#110 | 2916740-110.patch | 62.83 KB | chr.fritsch |
#108 | interdiff-2916740-103-108.txt | 1.08 KB | chr.fritsch |
#108 | 2916740-108.patch | 62.52 KB | chr.fritsch |
#104 | 2916740-103.patch | 63.04 KB | chr.fritsch |
Comments
Comment #2
chr.fritschI would propose to create the following generic actions:
Comment #3
chr.fritschHere is a first patch, that implements Publish/Unpublish actions and Save action.
Comment #5
chr.fritschI fixed some tests. No interdiff, because i regenerated the drupal-8.filled.standard.php.gz
Comment #7
chr.fritschSo i regenerated all the fixtures for the update tests, that the actions use the new plugin ids.
Comment #9
chr.fritschOk, hopefully all the tests are fixed now.
Comment #10
chr.fritschThis patch is just for better reviewing. It just doesn't contain the updated fixtures.
Comment #11
tstoecklerYay, I like this a lot!
Discussed this with @chr.fritsch in person at DrupalCamp Schwerin 2017. I'm not sure whether this (along with the rest of the new classes in the patch) belongs in the Action component or the Entity component. I'm slightly leaning towards Entity, but that component is already heavily bloated, so not really sure.
Wow, that's a pretty sweet idea! Great success.
I'm not 100% sure, but I think our standards require this to be called "EntityActionDeriverBase".
Per our standards this should be a proper sentence with a verb, i.e. "Returns the interface which..."
"Interface" -> "The interface"
1. I don't think this is technically restricted to content entities, I think that word can be dropped.
2. "implements" -> "implement"
3. Instead of mentioning "child classes" explicitly I would word this something like "the interface that this deriver requires." Because this documentation could for example be displayed inline when using this method in a child class and then it might be confusing to mention "child classes" here explicitly.
4. The sentence wraps too early, it should wrap at 80 characters.
This is extremely beautiful. Congrats and thank you!
I realize that you just copied this, but I think it would be more self-documenting to switch the two conditions because field-level access always implies entity-level access has been checked.
Same for the unpublish action.
Nice!!
Wow, this is incredibly strange. So we set the value to 0 so that
ChangedItem
will then detect a change and set itself to the request time? I know that's not your fault, but could we just set this to the request time directly?Does this need test coverage? I think the answer is yes, but not sure.
Not sure if this actually works, but could we provide a generic "action.configuration.entity_publish_action:*" configuration schema?
Discussed this with @chr.fritsch in person on whether this is BC break. But we couldn't really think of any possible way were a removed plugin would hurt. On the other hand, leaving this around (either as just the class or with the full annotation), so maybe a release manager can make a call here.
The comment should no longer mention "node".
Great success to be able to remove node-specific code from poor Content Moderation that is really trying hard to be generic. Very nice!
Ahh I forgot about
FieldUpdateActionBase
. I think we should be able to use that for the new actions, though, which is pretty nice, as we can then get rid of theaccess()
methods altogether.Nice catch! So this is a bug fix, do we need dedicated test coverage for that? Should not be too hard to add to
PublishActionTest
Also, the fix is not quite correct, as the module name might not be the entity type ID. You have to load the entity type and fetch its provider.
... "publish and unpublish entity actions."
Unneeded newline.
I don't feel that strongly, but the trend is to not use that method, and just do something like
"Test node " . $i
to avoid random ness (and, thus, random failures) in testsComment #13
chr.fritsch2-10: Fixed
11: I think it's already covered by MigrateActionsTest
12: Really nice, moved it to core.entity.schema.yml
14/15: Fixed
16: Is it ok to introduce the $entity parameter to getFieldsToUpdate?
17-20: Fixed
21/22: Needs still work
Comment #14
chr.fritschAdded update path and SaveAction test
Comment #15
chr.fritschAfter writing the update path i realized that changing the fixtures is totally bullshit. Sorry for that. So the new patch is without fixtures and with a update path test.
Comment #16
tstoecklerThank you a lot @chr.fritsch, this looks really nice. I think this is almost ready, I just have one note about the update path test. And since I'm knocking this back once more anyway I read through the patch again and found a couple of nitpicks.
I think instead looking at the config directly it would be nice to do more of an "integration test" and actually load the Action config entity and look at
$action->getPlugin()->getPluginId()
. That way we validate that the entity can still be loaded properly and the plugin can be instantiated.I think this comment can now be removed.
"plugin id's" -> "the plugin ID's"
Unnecessary newline.
Missing newline
Comment #17
chr.fritschBefore the runUpdates() it's not possible to load the action, because the old plugin ID's don't exists anymore.
Fixed all the nits.
Comment #18
tstoecklerPerfect, thank you!!! <3
Comment #19
xjmCan we deprecate the old classes, rather than removing them? I confirmed that actions only show up in the UI when they're supplied as default config, so with the update path and the new default config, we don't have to worry about the deprecated actions being surfaced as duplicates.
Comment #20
chr.fritschSure, the old action plugins are now back as deprecated and they extend the new ones.
Comment #21
tstoecklerOK, thank you for your input @xjm and for the quick turnaround @chr.fritsch. Back to RTBC
Comment #22
chr.fritschFor #2877383: Add action support to Media module we also need a DeleteAction. node and comment are implementing their own DeleteActions as well. So it would totally make sense to add a generic DeleteAction.
The question is, what about Drupal\entity\Routing\DeleteMultipleRouteProvider and Drupal\entity\Form\DeleteMultiple. They are needed that the DeleteAction can work OOTB. Should this functionality added here as well? Or should we pass everything around the generic DeleteAction to a follow-up?
Comment #23
chr.fritschI renamed the
getInterface()
toisApplicable
. Now we are a little bit more flexible and a possible DeleteActionDeriver could use the EntityActionDeriverBase as well.Comment #24
tstoecklerAhh, that's a nice idea, makes sense.
Yes, I think handling the delete action in a separate issue makes sense.
Comment #25
chr.fritsch@bojanz already opened an issue for that #2670730: Provide a delete action for each content entity type
Comment #26
chr.fritschI found out that @Sam152 did something similar in #2907075: Add EntityPublishedActionBase as a base class for all publishing status actions. So we have to merge them together nicely here.
Comment #27
chr.fritschI merged in some stuff from @Sam152. Mainly tests and some improvements around the plugin labels. So please also credit @Sam152 at commit.
Comment #28
Sam152 CreditAttribution: Sam152 as a volunteer and at PreviousNext commentedReview as follows! I do wonder if it would have been more manageable to each of the types of action in their own issue, but happy to manage them here if that's easier for you. We pretty much landed on the same solution it seems, bar some differences in the testing, so happy if this issue replaces the one you linked in #26.
I think it *IS* the schema, not the default schema right? It's just got a wildcard to capture all the derivatives. Could be wrong, but I think that's how it works.
This is really neat, nice!
Technically this could be based on anything, not just implementing interfaces right?
These aren't providing the actions, just the derivers. Maybe the comment could explain this more clearly? I think some
@see
references to the action classes would be great here too.I'm probably missing the context from the media issue, but not sure why I would just save something? The label also doesn't really indicate updating the changed time? Wouldn't that be managed by the entity class itself? Ignore this if it's part of some other system/I'm missing something.
Do we indent these?
I don't know if we can assume all implementations of the plugin will create their derivatives in this scheme. I think if we're doing this, we'll need to add a
calculateDependencies
method to the actual plugins and delegate this logic to our specific actions.@see
\Drupal\Component\Plugin\DependentPluginInterface
for plugins responsible for exposing their own dependencies to their config entity counterparts and\Drupal\Core\Plugin\PluginDependencyTrait::calculatePluginDependencies
for the code that gathers them up.What about a simple map?
Why key to zero, [] will do the same thing?
Did not know this was possible! Cool.
Do these tests cover the same thing?
Label mismatch.
Comment #29
tstoecklerWow, nice catch with #7, you are absolutely correct! Thanks for spotting that
Comment #30
chr.fritschThank you @Sam152 for the review.
1-4: Fixed
5: Node and comment have an action for re-saving. Media should get one, too. To trigger a re-save, we have to change something.
6-10: Fixed
11: Yes, they are covering the same thing. I think it's fine to remove KernelTestBase based ones. We are still covering these things in CommentActionsTest::testCommentPublishUnpublishActions()
12: Fixed
Comment #32
chr.fritschFix the tests
Comment #33
Sam152 CreditAttribution: Sam152 as a volunteer and at PreviousNext commentedChanges look great! Few little bits of nit feedback left.
Nit, but we use "applicable" and "participating". Why not standardise "getApplicableEntityTypes"?
Super nit, I think the "this" on the next line can be moved the previous line.
I think the docs are wrong.
Nice.
May as well add all references to classes in comments to a
@see
so the docs work better.Comment #34
chr.fritschThanks for reviewing again. Here are the fixes
Comment #35
Sam152 CreditAttribution: Sam152 as a volunteer and at PreviousNext commentedLooks good to me!
Comment #36
xjmI really like the way this is turning out.
Detailed review, mostly small docs stuff but a couple questions and things related to the deprecations.
I don't think the word "configuration" is right here. Configuration can't be published or unpublished. I think it's just publishing/unpublishing/saving?
Typo: "each entity types".
Nit: "Returns if" would mean it only returns at all in that case. I think it returns regardless. :) Maybe:
This is a little unclear; maybe an example would help? Maybe:
Nit: "ID" should always be capitalized.
+1 for this name.
Nit: "entity-based".
Usually we shouldn't type a generic array unless it's a render array. Is it a
mixed[][]
, a\Drupal\something\Something[]
, etc.?Also, it would help to explain what the array structure is. This could just be a reference to an example or another method that returns it.
Sorry if this is just copied from other plugins in core.
Nit: "plugin ID".
Is there no low-level interface for the data type here?
Again maybe this is copied from other plugins in core, but I figured it was worth asking.
Usually when we have access control methods we add some cacheability metadata; is that applicable here?
FWIW (in response to the earlier question) this makes total sense to me. A save action would be used in e.g. a bulk save form and might be combined with other changes or updates. Plus, we have both node and comment save actions in core already, so we do need this.
The deprecations should include a link to the change record (also we need a change record). See https://www.drupal.org/core/deprecation for examples.
Also, minor nitpick, it should say "9.0.0". 9.0.x could be any time in the first minor release, which isn't what we mean. :)
These should all have a
@trigger_error()
as well. See https://www.drupal.org/core/deprecation for examples.This also seems BC-break-ish. Content Moderation is in beta so it needs to have BC too. So I guess we should deprecate the old ones for Content Moderation as well.
Nit: "plugin IDs".
Thanks!
Comment #37
xjmHm, I think maybe we should also have some tests for the config dependency calculations.
Comment #38
chr.fritschRegarding #36:
1-7: Fixed
8: I changed it to mixed[]. Not sure what else to write. We get an empty array there.
9: Fixed
10: Not sure what to write. It's the copied comment from the base class.
11: I checked several other core action plugins and none of them adds cacheability metadata.
13-16: Fixed
Also started with the CR: https://www.drupal.org/node/2919303
NR for testing the patch. Test for #37 still missing.
Comment #39
chr.fritschIs that enough for checking the dependency?
Comment #40
tim.plunkettThe new plugin classes look great!
With this strict ID check, the deprecated classes won't work. Shouldn't this provide BC?
Is there a reason this is preferred over \Drupal\Core\Entity\EntityTypeInterface::getBundleLabel()?
Ah, this is why we don't have to worry about BC above.
Why the need for list()?
I'd expect this to be
'comment_publish_action' => 'entity_publish_action:comment',
andforeach ($array as $before => $after) {
In theory these entities are not the only thing that could be using action plugins, but it is the only usage in core. 👍
Comment #41
xjmHm, actually, that might be a reason to do a more generic update path, in order to truly provide full BC.
Comment #42
chr.fritschI changed the update hook. Now it's more generic and should support not core actions as well.
Comment #43
amateescu CreditAttribution: amateescu for Pfizer, Inc. commentedNice work! I found mostly small things to change, except for points 3. and 4. for which I'm setting back to NW.
This should be
EntityTypeManagerInterface
.EntityActionDeriverBase ;)
Shouldn't we check if we actually have an entity object available?
We can't use the entity API in update hooks, this needs to get the config files with something like
\Drupal::configFactory()->listAll('system.action.')
.See
field_update_8001()
for an example.How about "Tests the upgrade path for converting comment and node actions to generic entity ones"?
This needs a docblock as well, we can copy the one above. And we should also put a
@see system_update_8500()
.Comment #44
tim.plunkettAlternatively, a solution for #43.4 would be using a post_update hook (they can use the Entity API), see
block_post_update_fix_negate_in_conditions()
for an example.Comment #45
chr.fritschThanks for reviewing, amateescu. I'm happy to see, that so much experienced devs jumped on this issue.
Fixed all the nits from #43.
Regarding #43.3: I think the derivers already take care about the correct input values.
Comment #46
amateescu CreditAttribution: amateescu for Pfizer, Inc. commentedThen we need to remove the default NULL value for the $entity argument :)
Comment #47
chr.fritschThat's not possible, because then the method is not compatible to the ExecutableInterface::execute() :(
Comment #48
amateescu CreditAttribution: amateescu for Pfizer, Inc. commentedOh, okay, so the default NULL value is there to satisfy the parent interface which doesn't have this argument, makes sense.
I think we're good to go then.
Comment #49
chr.fritsch#2909435: Update block library page to adapt publishable block content implementation also needs this.
Comment #50
xjmGood catch @amateescu on #43.4; I missed that when reviewing it before.
Comment #51
xjmThese two lines need to be under 80 characters. Attached fixes that.
Comment #52
xjmAll our other actions in core use the infinitive/imperative verb form, "Make content sticky." "Save content." Etc. Let's follow that pattern here; no
-ing
.Comment #53
chr.fritschOk, i changed the label.
Hopefully this was the final fix. Now i cross my fingers to get this committed :-)
Comment #54
Manuel Garcia CreditAttribution: Manuel Garcia as a volunteer and at Appnovation for Pfizer, Inc. commentedInterdiff looks good, back to RTBC assuming it comes back green :)
PS. <3 this issue!
Comment #55
Manuel Garcia CreditAttribution: Manuel Garcia as a volunteer and at Appnovation for Pfizer, Inc. commentederr... crap, ignore my files please, @chr.fritsch beat me to it and i forgot to remove them before posting my comment, do not give me credit for these! :S
Comment #56
Sam152 CreditAttribution: Sam152 as a volunteer and at PreviousNext commented@Manuel Garcia, you took the time to move the issue forward, just at the same time as someone else, credits don't cost much after all :)
+1 RTBC
Comment #57
xjmCrossposts seemed to weirdify patches in the summary, so fixing that so that I don't commit the wrong patch. :P
Comment #58
xjmI'm in the process of doing a thorough review here. Thanks everyone!
Comment #59
dawehnerDon't we use action.configuration.*.* usually if we want to share the same configuration between things?
🙃 I like using $object->get($key), its less magic, but yeah this is just a personal nitpick.
Idea for a follow up: Not extend PublishAction either, but just make an an empty execute implementation.
Putting my test maintainer head one for a sec. Are these unit tests really testing something? For example testSaveAction looks really coupled to the current code. Given that I'm wondering whether writing a kernel test instead wouldn't be better, and probably much smaller!
Comment #60
xjmThanks @dawehner. Setting NR for #59.
Comment #61
chr.fritschI changed the tests to be KernelTests based.
Comment #63
chr.fritschThis needed a reroll because #2917883: Rename 'migration_templates' directories in core modules to 'migrations' landed
Comment #64
seanBDo we need to mock this?
About #59.1: Just checking, but don't we need the label for each separate action? If not, the patch in #61 is good. There is a lot of shared action configuration in core already, but I didn't see any occurance of
action.configuration.*.*
.About #59.3: I think you will still need to do a save action for unmoderated content right? So I think an empty execute method would not work.
Comment #66
chr.fritschI adjusted the
testGetDerivativeDefinitions
calls to be more simpler as well.Testbot will still fail, because since #2870194: Ensure that process-isolated tests can use Symfony's PHPunit bridge to catch usages of deprecated code landed it's not clear how to correctly mark plugins deprecated. There is an ongoing discussion on irc with berdir and alexpott. We will see.
Comment #67
chr.fritschI think we have to postpone this on #2922451: [policy no patch] Make it possible to mark plugins as deprecated
Comment #68
chr.fritschAfter some research in the plugin world, i think we could solve it without waiting for #2922451: [policy no patch] Make it possible to mark plugins as deprecated.
I added
FallbackPluginManagerInterface
to theActionManager
to return the new plugin_id's in case a old one should be loaded. Then i removed the @Action annotation, that means, the old plugins are no longer picked up from the plugin discovery.Comment #70
chr.fritschFixed the last failing test, by just loading the config item before the update execution.
Comment #71
seanBThe changes look good to me, but I think we need consensus in #2922451: [policy no patch] Make it possible to mark plugins as deprecated to figure out if this is really the way we want to deprecate the plugins.
Could you also check for my other comment in #64 regarding the change to
action.configuration.*.*
.Comment #72
chr.fritschI updated #66 based on the current proposal from #2922451: [policy no patch] Make it possible to mark plugins as deprecated.
Regarding:
I think it's fine because action labels from the schema are not exposed to the UI. Action definitions have their labels which are used.
Comment #74
BerdirWe are not removing this, we are just deprecating it, so we can not remove the config schema, we can only do that once we actually remove the classes in 9.x
Comment #75
chr.fritschThanks for reviewing @Berdir.
I brought the schemas back and added a deprecation message to them.
Also, the last failing test should be fixed.
Comment #76
dawehnerShouldn't this deprecation be part of the constructor as well?
For a bit of more clarity I would named it
old_new_action_id_map
or something along those lines.Is there a reason why there is a saving and a publish test, but not one for unpublish?
Comment #77
chr.fritschFixed #76
1. Missed that, thanks
2. Done
3. There is a test for unpublish in
PublishActionTest
. The reason I added it there isPublishAction
andUnpublishAction
are using the same deriver.Comment #79
chr.fritschTestbot hickup
Comment #80
alexpottthis looks very generic. Can't we have
action.configuration.entity:*:*
maybe by renaming the plugin's,for example,
entity:publish_action
how about
$action_plugin_map
?Nice! extra test coverage.
Should trust the data to avoid schema rebuilds since that can cause issues at this point in an update.
Comment #81
chr.fritschThanks for reviewing @alexpott
I fixed everything from #80
Comment #83
chr.fritschTestbot hickup
Comment #84
alexpottI've read through all the issue comments to try to ensure all the feedback has been incorporated.
Thinking about this some more - it probably should be a post update and use the action configuration entity and not use raw configuration. This makes it less special and allows us to test the dependency calculation in UpdateActionsWithEntityPluginsTest which is something @xjm asked for in #37 - also @tim.plunkett had the idea of post updates in #44.
In #40.5 @tim.plunkett noted that the action plugins can be used by other things than the action configuration entities in contrib. The CR and the deprecation notices help to inform these use-cases - there's nothing else core can do.
Comment #85
alexpottLet's also add dependency checking to these tests so that it's not just the Update test and the Comment test that give us coverage.
Comment #86
chr.fritschOk, I changed the update hook to be a post update and added dependency checks to UpdateActionsWithEntityPluginsTest, PublishActionTest and SaveActionTest.
Comment #88
chr.fritschAs suggested by @alexpott via slack, I had to add the deprecation messages to
DeprecationListenerTrait::getSkippedDeprecations
in order to prevent the warnings in WebTest based update path tests.Comment #89
alexpottOpened two issues as a result on #86/#88
+1 to adding them to the skip list fort now because all upgrade path tests are going to trigger them.
Comment #90
alexpottAdding issue credit to people for their constructive reviews.
Comment #91
tstoecklerAll feedback has been adressed, it seems to me. Read through the entire patch again and couldn't find anything to complain about. Thanks!! Let's get this in.
Comment #92
chr.fritschJust a small documentation fix
Comment #93
tstoecklerOh, nice catch! Thanks. Still looks good.
Comment #94
larowlanAny reason why the save action doesn't check field access like the other two? I tried to scan the comments to see why, but could not find any mention of it.
Comment #95
tstoecklerI suppose the reason is that the current
SaveNode
andSaveComment
where this was taken from do not do that....but we totally should check that as well! Nice catch.
Comment #96
chr.fritschI looked into it a bit, I don't know how to check the field access because we don't have an entity key for the changed field. That means every entity type the implements EntityChangedInterface, could save the changed value in a different field. So we can not predict on which field the access should be checked.
So setting this back to NR.
Comment #97
tstoecklerAhh, yes that's right. This is a bit weird currently in core. In
\Drupal\Core\Entity\EntityChangedTrait
we actually hardcode the field to be called'changed'
(which has also been discussed in #2209971: Automatically provide a changed field definition), which we could do here, as well. One could also argue, though, that the usage of the trait is not required even for people implementing the interface, so we shouldn't hardcode it here.Leaving at needs review for now.
Comment #98
alexpottSo maybe a way forward is to make sure that the save fails if the user doesn't have access. We can also check if the entity uses the trait and if it does check access for the changed field. That way if the entity uses a different field and the user has access it'll still work and we'll have tested what happens if the user does not have access. And for most use-cases
::access()
will work as expected.Comment #99
alexpottAnother thought is we could make the action only applicable if the entity uses the trait.
Comment #100
alexpottCrediting @larowlan for the review.
Comment #101
chr.fritschI tried the approach to check if the object implements the trait and then check the field access on the changed field directly.
I had to use orIf to combine both results because
$object->changed->access('edit', $account, TRUE)
returns AccessResultNeutral.AccessResultNeutral andIf AccessResultAllowed => AccessResultNeutral
AccessResultNeutral orIf AccessResultAllowed => AccessResultAllowed
Comment #103
tstoecklerRe #101: but why does the above work, then? I guess I am missing something but they look pretty similar to me.
Comment #104
chr.fritschCheckin the field access for the 'status' field returns AccessResultAllowed - not AccessResultNeutral.
I think it's because of NodeAccessControlHandler::checkFieldAccess
Comment #105
alexpottI think that the default field access is allowed... see \Drupal\Core\Entity\EntityAccessControlHandler::checkFieldAccess()
Comment #106
chr.fritschOk, now I found the real reason. It's
Drupal\Core\Field\ChangedFieldItemList
which doesn't allow to edit the change field.So maybe it's the best to go with the solution we had before. Just checking if the user has 'update' permissions.
What the save action should achieve is only resaving the entity. But to do that we have to at least change one value. So changing the 'change' field is at least a workaround to tell the storage, something has changed, please resave my entity.
Comment #107
tstoecklerYes, I think #106 is a very good explanation. Would be nice to confirm with @alexpott, but for what it's worth I agree with your assessment.
Comment #108
chr.fritschHere is a patch, based on my proposal from #106
Comment #109
alexpott@chr.fritsch works for me - it'd be also great to check with @larowlan as the access issue was raised by him in #94. I also think a comment to explain why field access is not taking into account is a good idea.
I think a comment is worth it here.
Comment #110
chr.fritschOk, fine. Here is some explanation.
Comment #111
larowlanThis looks good to me
Comment #112
alexpottThanks everyone. This is good to go.
Committed cbd3299 and pushed to 8.5.x. Thanks!
Comment #114
chr.fritschThank you everybody for your patience. I am so happy to see this landed. I hope to see you all in #2670730: Provide a delete action for each content entity type, the last blocker before we can fix #2877383: Add action support to Media module in a proper way.
Comment #116
Manuel Garcia CreditAttribution: Manuel Garcia as a volunteer and at Appnovation for Pfizer, Inc. commentedCurrently the CR for this only details which plugins were deprectated.
Can we update it to document what a contrib entity type would need to do to benefit from this?
Something similar to what the generic delete action CR has would be very beneficial: https://www.drupal.org/node/2934349
Comment #117
tim.plunkettThe change in #80.1/81 broke getBaseId() and getDerivativeId() for Action plugins.
This was not a regression in HEAD at the time, because before this, Action plugins didn't use derivatives.
But #2458769: Derivative plugin definitions contain base plugin IDs instead of derivative IDs is exposing this bug.
Consider the plugin ID
entity:publish_action:node
It is defined as
entity:publish_action
on the plugin, and the:node
is added by the deriver.Code:
Expected:
Actual:
I might try to fix it in the other issue, or I may open a new issue.
Comment #118
AaronBaumanHi, i'm trying to figure out whether to open a new issue to add
FallbackPluginManagerInterface
toActionManager
, and I found this thread.Looks like it was added in #68, then dropped off in subsequent patches:
Can anyone help me understand why
FallbackPluginManagerInterface
and a default "Broken" action plugin was not ultimately included in this commit, and whether I should open a new issue to request it?