Problem/Motivation
As an overall issue based on #2292707: GET on entity/taxonomy_vocabulary/{id} is not working it is weird we cannot GET to ConfigEntities.
Some use cases are
- Get Vocabulary name to display for the current language.
- Get Menu items for the headless app.
- Get site name (is not a ConfigEntity!)
Proposed resolution
As rest already has a view permission why not just return ConfigEntities for GET ops?
Some examples
curl --user admin:admin --request GET http://drupal.d8/entity/taxonomy_vocabulary/tags?_format=json
{"uuid":"091cf3b1-de66-4dd8-8403-3d6d63de5d43","langcode":"en","status":true,"dependencies":[],"name":"Tags","vid":"tags","description":"Use tags to group articles on similar topics into categories.","hierarchy":0,"weight":0}
curl --user admin:admin --request GET http://drupal.d8/entity/menu/main?_format=json
Remaining tasks
- The anonymous call should not result in error. Is that related to #1916302: Serve REST errors as application/api-problem+json OR application/vnd.error+json ?
curl --user "anonymous:" --request GET "http://drupal.d8/entity/taxonomy_vocabulary/tags?_format=json" {"error":""}
User interface changes
API changes
Files:
| Comment | File | Size | Author |
|---|---|---|---|
| #64 | interdiff.txt | 13.38 KB | dawehner |
| #64 | 2300677-64.patch | 19.84 KB | dawehner |
| #60 | 2300677-60.patch | 7.33 KB | dawehner |
| #50 | support_configentity-2300677-50.patch | 3.74 KB | -enzo- |
FAILED: [[SimpleTest]]: [PHP 5.5 MySQL] Unable to apply patch support_configentity-2300677-50.patch. Unable to apply patch. See the log in the details link for more information. View
| |||
| #42 | support_configentity-2300677-42.patch | 5.4 KB | -enzo- |
FAILED: [[SimpleTest]]: [PHP 5.5 MySQL] Unable to apply patch support_configentity-2300677-42.patch. Unable to apply patch. See the log in the details link for more information. View
| |||
Comments
Comment #1
clemens.tolboom CreditAttribution: clemens.tolboom commentedComment #2
Berdir CreditAttribution: Berdir commentedConfig entities have no validation and access API beside their UI's/Forms, so exposing over REST is tricky.
If we'd want that, it would be clearer if that would be a completely separate plugin and serialization, that would just directly use toArray().
Comment #3
clemens.tolboom CreditAttribution: clemens.tolboom commented@Berdir thanks for the quick response. But I don't understand. For me its 'just' an entity where rest manage permission. Why distinguish on Content versus Config? Patch seems valid to me :p
Patch skips field access for ConfigEntities checks but not entity view.
What do I miss?
Comment #5
tstoeckler CreditAttribution: tstoeckler commentedYeah, I agree that access checking should be sufficient for config entities. We have been moving away from route-based access (i.e. using _permission directly) to entity-level access for config entities so that should work fine. And in terms of validation we can use the new
SchemaCheckTrait. It's not as powerful as content entity validation, but I think it too should be sufficient to validate that nothing completely bogus enters the system.Comment #6
Berdir CreditAttribution: Berdir commentedMaybe, but that still means that it would be a separate plugin for config entities and IMHO a feature request, not a bug. The only bug seems to be that you can configure rest.module to expose config entities right now an it's then choking on it...
Comment #7
clemens.tolboom CreditAttribution: clemens.tolboom commentedI just checked service 7.x-3.x module which exposed 2 config `entities`
I myself ran into what menu item belong to ie 'main' which both are config entities :(
Use case: A headless Drupal with AngularJS menu controller.
From the list below I'm not sure we need all ConfigEntities available but at least menu, menu_link, tour are very useful.
@tstoeckler what code should be changed for CRUD through REST for ConfigEntities?
Comment #8
Berdir CreditAttribution: Berdir commentedWhat services supported and not is not really relevant, a feature in a contrib module doesn't mean that not having it in core is a regression :) Especially because 7.x did not differentiate between config and content entities, services.module did not integrate entities in a generic way and system is not an entity :)
If one config entity is supported then all are.
Comment #9
clemens.tolboom CreditAttribution: clemens.tolboom commentedI was only trying to list and select 'valid' reasons to expose a ConfigEntity. In the end permissions guard what is exposed.
I hope for some pointers to fix this bug.
Comment #10
Grayside CreditAttribution: Grayside commentedConfiguration being what it is in Drupal, exposing it even behind permissions is a little like exposing custom module code if you've got the right permission. The delicate balance there seems pretty good for Contrib to explore, and maybe something gets into 8.1.
In practice, I expect it's not the full config entity you need, but some externally useful information (e.g., the name of a vocabulary), associated with the content it configures. Full CRUD support for Config would make this an API for building your Drupal site, and that seems like a glaring potential for massive security problems.
Comment #11
moshe weitzman CreditAttribution: moshe weitzman commentedIn an effort to constrain scope. the REST team decided to focus on content entities and not config entities. I'd be happy if someone took up this important feature. Retitling and recategorizing accordingly.
Comment #12
clemens.tolboom CreditAttribution: clemens.tolboom commented@moshe weitzman it's good to focus on content.
I hope for some more pointers on how to solve this issue.
Comment #13
Wim Leers CreditAttribution: Wim Leers commentedI'm no REST expert, but from what I can tell, the main problem is validation when modifying config entities.
What if core would only support reading config entities? That'd satisfy the majority and still defer the most complex parts to contrib.
Comment #14
clemens.tolboom CreditAttribution: clemens.tolboom commentedWhen adding GET on ConfigEntityType we should block the other methods for sure otherwise we get core bug reports when people enable permissions on those methods.
Comment #15
clemens.tolboom CreditAttribution: clemens.tolboom commentedXREF #1897612-16: Add serializer support for YAML
Comment #16
clemens.tolboom CreditAttribution: clemens.tolboom commentedTrying building a web app we are blocked for not GETting Vocabulary and Menu and even just the site name.
What options do we have to expose these resources and what more resources are valid candidates to expose for GET?
Comment #17
-enzo- CreditAttribution: -enzo- commentedDuring the Spring of DrupalCon Amsterdam 2014 I did a debug of how get via Rest Config Entity
I did my test with Entity entity:entity_form_display and the URL I use test was http://example.com/entity/entity_form_display/node.article.default after pass the Basic Auth I got a Access Denied 403.
The access denied was trigger in Resource Drupal\Core\Entity\Entity\EntityFormDisplay. because the class Drupal\rest\Plugin\rest\resource\EntityResource tried to execute the method access and doesn't exist.
I will improve the function get of Class EntityResource
ASAP I got a patch I will upload.
Comment #18
clemens.tolboom CreditAttribution: clemens.tolboom commented@-enzo- this issue has a patch already. What is wrong with that patch?
Note there is #2339815: Limit EntityResource to content entities, rather than them causing fatal errors which is doing the opposite.
It would be great to have more use cases into the summary so please add yours.
Comment #19
-enzo- CreditAttribution: -enzo- commentedUhhh my fault, I will review and provide a feedback if works for Entity Form Display
Comment #20
alansaviolobo CreditAttribution: alansaviolobo commentedComment #21
clemens.tolboom CreditAttribution: clemens.tolboom commentedComment #22
-enzo- CreditAttribution: -enzo- commentedHi folks
I did a patch to support Entity Display entities via Rest, fixing the error trying to call access method with view parameters, also add current validation to confirm the user has access to get Entity Display definition.
To test this patch you can use the Chrome plugin Simple REST Client and the URI http://example.com/entity/entity_form_display/node.article.default remember enable the resource using the Rest UI module as you can see in the following image
As you can see in configuration you must to use Basic Auth in Rest Client and be sure the header Accept with application/json
As result you will get something similar to this output
Comment #23
dmouse CreditAttribution: dmouse commented@-Enzo- thanks, works for me! =)
Comment #24
clemens.tolboom CreditAttribution: clemens.tolboom commentedPatch look great. Hope to review this week. This needs some tests.
Remove white line
prepend white line
Why add line breaks in the arguments list? Grepping on core source tree show lots of single line __construct.
Fix indentation of function body.
Use instanceOf instead
Comment #25
-enzo- CreditAttribution: -enzo- commentedHI @clemens.tolboom I did a new patch following your recommendation, please check and let me know if works for you.
Comment #26
clemens.tolboom CreditAttribution: clemens.tolboom commentedGeneral: this needs tests too to confirm the GET versus other ops work as expected.
This seems unrelated.
This seems unrelated.
Fix indentation.
Comment #27
-enzo- CreditAttribution: -enzo- commentedHi @clemens.tolboom
I remove unrelated code and fix indentation
Comment #28
-enzo- CreditAttribution: -enzo- commented@clemens.tolboom how I can do this " this needs tests too to confirm the GET versus other ops work as expected."?
Comment #30
MartijnBraam CreditAttribution: MartijnBraam commentedI've tried the patch to get the contents of the main menu. (The path in REST UI is incorrect. The /entity part is missing)
The response is correct but useless:
The thing I needed was the items in the menu, not the metadata of the main menu.
Comment #31
-enzo- CreditAttribution: -enzo- commentedHi @MartijnBraam
About the missing entity in end point, maybe you need to update the Rest UI module I did a patch to resolve that issue #2290605: REST URI paths changed to canonical paths.
About the entity menu did you request, after enable the Entity Menu Resorce as you can see in the following image.
When I tried to consume this end point using the URL http://example.com/entity/menu/main I got the following error
[Wed Oct 15 06:35:14 2014] [error] [client 127.0.0.1] PHP Fatal error: Call to a member function access() on a non-object in /Users/enzo/www/drupal8beta/core/modules/rest/src/Plugin/rest/resource/EntityResource.php on line 52I will debug and propose a new version of patch.
Comment #32
-enzo- CreditAttribution: -enzo- commentedAttached you can find a new patch testes Menu, Nodes and Entity Display Form
Comment #33
clemens.tolboom CreditAttribution: clemens.tolboom commentedComment #34
clemens.tolboom CreditAttribution: clemens.tolboom commentedEhm ... I did not delete file from #32 ... how could I delete that file!?!?
Comment #35
clemens.tolboom CreditAttribution: clemens.tolboom commentedI've tested using Rest UI to configure + permissions for anonymous with
both gives
Attached patch adds a test as an example. It needs some fixes.
Comment #37
clemens.tolboom CreditAttribution: clemens.tolboom commented@-enzo- I used your patch from #32
Below the changes I did. Interdiff was better :-/ I added a test which 'nicely' failed.
Added space after if
Don't use label.
Comment #38
-enzo- CreditAttribution: -enzo- commentedHi @clemens.tolboom
Using you patch #35 I did a new patch, because the way you use to get the Id of plugin return empty because is not an object is an array, but if you test with admin user the validation never is executed.
About the test I can't test because I'm getting a awful error trying to list the test to execute.
ASAP I resolve this issue I will work in testing, but meanwhile do you have any idea what is wrong in test? Also the test must be cover in this issue or maybe we can create a new issue?
Comment #39
clemens.tolboom CreditAttribution: clemens.tolboom commented@-enzo- thanks for the feedback and sorry for the bad code :-/
Just remove devel module temporary.
I wrote #35 in order to show you were test could be written.
Test must be in this issue :-)
Comment #40
-enzo- CreditAttribution: -enzo- commented@clemens.tolboom I follow your instructions and remove the devel issue, but now I got a new error if I try to run any Test you can see the error at #2341997: Uncaught exception - Circular reference detected for service "database".
Maybe you can consider to separate the Test in other issue and if work the patch apply to Drupal Core.
Any thoughts?
Comment #41
tim.plunkett CreditAttribution: tim.plunkett commentedComment #42
-enzo- CreditAttribution: -enzo- commentedHey folks
I did a re-roll of path #38 to meet the latest changes in Drupal 8 but still works in Unit Test are required.
Comment #43
djbobbydrake CreditAttribution: djbobbydrake commentedHi all. Tried the patch in 42 (support_configentity-2300677-42.patch), and still getting the metadata for menu:
Is this patch supposed to pull the actual menu items?
Comment #44
Berdir CreditAttribution: Berdir commentedNo, the patch is not. Menu links are something else entirely. The menu config entity *is* the menu metadata.
I still have the opinion that providing generic support for config entities is problematic and unneeded. In many cases, they will not give you the data you actually care about. See above.
The only real use case I see for the current content entity implementation is to synchronize data 1:1 between equal systems, e.g. a staging/production site. It is an internal representation of the raw data.
For config entities, we have the configuration sync/import API, and nothing we do could do here would come close to what that provides, with diffs, and sync flags and so on.
IMHO, if you want an API that you can use from an external source, e.g. an app, or a public API for your clients, especially if that involves config entities but likely even for content, then write it yourself, then you can define an API and structure that makes sense for your use case. Take the example in #43, where the expectation is to get all the menu links, which are actually plugins, with different sources. There is no way we can make a generic API that supports that, but it should be fairly easy to write a custom resource plugin that returns menu links in a simple structure.
Comment #45
-enzo- CreditAttribution: -enzo- commented@Berdir I use this patch with a Headless Drupal Generator github.com/enzolutions/generator-marionette-drupal , in my case is good idea because in that way I can generate HTML5 forms based in Drupal 8 site current status.
I know you point an API is only for data, but with proper permissions you can expose this information to create great tools and services integrated with Drupal 8
Comment #46
webchick CreditAttribution: webchick commentedYeah, I really don't understand how you can write a custom front-end for a Drupal 8 site without supporting at least some config entities. The inability to get vocabulary names when displaying a node is a huge limitation.
Comment #47
clemens.tolboom CreditAttribution: clemens.tolboom commentedToday I revisited our tiny effort to mimic garland using Angular https://github.com/build2be/drupal-8-rest-angularjs
It could not list the term names as we have a list of nodes on taxonomy/term/:tid which renders the term on HTML but there is no equivalent in REST context. Adding a view we can add a list of terms which partly solves term names.
But IMHO it should not be necessary to build that view on every site. It should be out of the box.
To really build the mentioned Garland App menu items are really needed. As menu items are not config entities (what are they?) I guess a contrib module should solve that :-/
Comment #48
andypost CreditAttribution: andypost commentedComment #49
-enzo- CreditAttribution: -enzo- commented@clemens.tolboom Correct you can solve that with view because is content.
But in my case I want to create a REST Frontend #headless Drupal with Backbone with the capability to generate Forms for content types based in current content types definition in a Drupal 8 site, how you can solve that with out expose a config entity?
If you check the patch the rest resource require a specific permission to access config entities, so IMHO is not security issue. Also a Rest Resource has a security level with Authentication Provider selected when the Rest Resource is enabled.
If the argument to disable this option is force users to create content in Drupal instead of provide the option the user to decide how access his content even the admin content is the wrong angle.
Comment #50
-enzo- CreditAttribution: -enzo- commentedHey folks
I did a re-roll of path #42 to meet the latest changes in Drupal 8 but still works in Unit Test are required.
Comment #51
clemens.tolboom CreditAttribution: clemens.tolboom commentedIt seems like #2308745: Remove rest.settings.yml, use rest_resource config entities together with #2397271: REST configuration fails if it contains a plugin reference that does not exist is doing what this issue tries to attempt.Comment #52
clemens.tolboom CreditAttribution: clemens.tolboom commentedI misread #2308745: Remove rest.settings.yml, use rest_resource config entities so remove my refs.
Comment #53
davidwbarratt CreditAttribution: davidwbarratt at Golf Channel commentedKicking of the testbot to see if we need a re-roll....
Comment #57
frob CreditAttribution: frob at Clarity Innovations, Inc. commentedNot sure if this should still be 8.0 or 8.1 but, I will see if I can reroll this patch.
Comment #59
Wim Leers CreditAttribution: Wim Leers at Acquia commentedComment #60
dawehner CreditAttribution: dawehner as a volunteer and at Chapter Three commentedI worked a bit on it, here are some bits I ran into it on the meantime.
Comment #62
Wim Leers CreditAttribution: Wim Leers at Acquia commentedLooks great!
Shouldn't we perform config schema validation for config entities? See
\Drupal\Core\Config\Schema\SchemaCheckTrait— hattip @tstoeckler in #5.Comment #63
Wim Leers CreditAttribution: Wim Leers at Acquia commentedClosed #2650792: What permissions control REST's field_storage_config? as a duplicate, another person wondering why this doesn't work, and the lack of helpful errors also getting in the way.
I think it's safe to say this is at least major.
Comment #64
dawehner CreditAttribution: dawehner as a volunteer and at Chapter Three commentedMade some progress:
Comment #65
frob CreditAttribution: frob at Clarity Innovations, Inc. commentedComment #67
dawehner CreditAttribution: dawehner as a volunteer and at Chapter Three commentedNote: This is blocked on #1928868: Typed config incorrectly implements Typed Data interfaces technically, doesn't mean though one cannot work here.
Comment #68
dawehner CreditAttribution: dawehner as a volunteer and at Chapter Three commentedLet's be more honest about it.
Comment #69
clemens.tolboom CreditAttribution: clemens.tolboom commentedFixed links using _format now.
Comment #70
dawehner CreditAttribution: dawehner as a volunteer and at Chapter Three commentedLet's work first of the GET aspect of things, see #2724823: EntityResource: read-only (GET) support for configuration entities
Comment #71
frob CreditAttribution: frob at Clarity Innovations, Inc. commentedwhat does pp-2 mean?
Comment #72
clemens.tolboom CreditAttribution: clemens.tolboom commented@frob postponed level 2 see #2335229: [meta] REST et al and #2721489: REST: top priorities
Comment #73
Wim Leers CreditAttribution: Wim Leers at Acquia commented