Skip to content

Manage embedded fields for API Platform Filter #984

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

Merged
merged 1 commit into from
May 23, 2017

Conversation

jsamouh
Copy link
Contributor

@jsamouh jsamouh commented Mar 13, 2017

Q A
Bug fix? yes
New feature? no
BC breaks? no
Deprecations? no
Tests pass? yes
Fixed tickets #969
License MIT
Doc PR N/A

This PR is to aliment a discussion about how to manage embedded fields in API Platform Filter
This PR works form Boolean Filter Only. It works recursively Entity->Embed Fields -> Embed Fields..
No Tests is developped for the moment

@jsamouh jsamouh changed the title Manage embedded fields for BooleanFilter Manage embedded fields for API Platform Filter Mar 13, 2017
@@ -116,7 +116,7 @@ protected function isPropertyEnabled(string $property): bool
*/
protected function isPropertyMapped(string $property, string $resourceClass, bool $allowAssociation = false): bool
{
if ($this->isPropertyNested($property)) {
if ($this->isPropertyNested($property) && !$this->isPropertyNestedEmbedded($property, $resourceClass)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this condition valid everytime? I mean, will it break current implementations if we put this inside isPropertyNested so that other filters also benefits from this? Maybe it's just the boolean filter that's impacted, but I doubt that.

Copy link
Contributor Author

@jsamouh jsamouh Mar 13, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes it will breaks 👍
If we put the code in isPropertyNested, it disturbs for differents reasons:

  • 1/ it means that a embed field is not considered as a nested field. In fact it is by definition :-)
  • 2/ the function extractProperties in AbstractFilter use isPropertyNested and for an Embed field, it has to be needsFixing to true. Otherwise, it fails for the request.

This code is in AbstractFilter, so any Filter will benefit the code.
Normally the only thing to change for each filter is isBooleanField, isDateField, isNumericField...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay got it. I'd add a method that ends up doing $this->isPropertyNested($property) && !$this->isPropertyNestedEmbedded($property, $resourceClass) though. Feel free to add tests.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not agree that an Embedded field should be considered a "nested property". isNestedProperty is to help us find out when we need to join.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed ofc. Smth like isPropertyNestedFilterable

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@teohhanhui , you're right for that. So We confirm that a nested property concerns only join ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@teohhanhui @soyuka , what about extractProperties method in the class AbstracFilter ? The property $needsFixing to true. Otherwise the embed field embed_b.field is transformed to embed_b_field and generates an error in the request

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that's the approach that I'd take.

Embedded fields are inlined to the field mapping, apparently (see https://github.com/doctrine/doctrine2/blob/v2.5.6/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php#L3230-L3264), so there should be no further changes necessary.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, we also need to fix extractProperties. $needsFixing = true for embedded fields. 😄

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So you may still find it valuable to extract the logic into, say, isPropertyEmbedded.

@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 13, 2017

To explain a little bit:

  • Embed field is a nested property. So it makes sense according to me to recognize this field as a nested property. However, we need to dissociate nestedAssociation versus nestedEmbedded.
  • So I create the method isPropertyNestedEmbedded in AbstractFilter and apply it when necessary. This functions just needs to know if the Metadata owns this fields. An Embed field is managed like a simple field
  • I modify a little bit the method isBooleanField in BooleanFilter to retrieve metadata in the same way as the function isPropertyMapped in AbstractFilter
  • I modify the QueryNameGenerator of API platform to replace . by _ cause it generates an error when we set the parameter (not pretty)
  • I did not develop isPropertyAssociation cause it costs performance so I prefer to use isPropertyNested and use Negation in the code to know if the property is a nested association

@soyuka
Copy link
Member

soyuka commented Mar 13, 2017

Is this issue limited to the booleanFilter?

@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 13, 2017

@soyuka , for the moment yes. I'm waiting your feedback before to apply it in any filter and write STRONG tests about this

@jsamouh jsamouh force-pushed the nested-embed-field-filter branch 2 times, most recently from 572a083 to 08f0acb Compare March 13, 2017 15:36
@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 13, 2017

@teohhanhui @soyuka , second commit for discussion (apply the code in all filters). No unit and functional tests are developped for the moment. But existing tests success

@soyuka
Copy link
Member

soyuka commented Mar 13, 2017

Better, I'd need @teohhanhui to confirm but I think that we break backward changes by adding $resourceClass. This'll have to target master.

@jordscream would be nice to have a functional test involving those embedded properties. For unit tests, coverage looks fine not sure you'd be able to add much.

@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 13, 2017

@soyuka , no problem for functionnal test, writing in progress

@antograssiot
Copy link
Contributor

In unit test, I might be wrong but I wanted to make sure that the filter description worked ok.

@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 14, 2017

@soyuka @teohhanhui Why we call dropSchema to execute an insert just after ?
https://github.com/api-platform/core/blob/2.0/features/doctrine/date_filter.feature#L267-L269

@soyuka
Copy link
Member

soyuka commented Mar 14, 2017

dropSchema executes after the scenario is complete (https://github.com/api-platform/core/blob/2.0/features/bootstrap/FeatureContext.php#L88).

Doing this there ensures that the next scenario has a clean database

@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 14, 2017

@soyuka My apologize....

@jsamouh jsamouh force-pushed the nested-embed-field-filter branch from 08f0acb to 2d95b70 Compare March 14, 2017 17:05
@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 14, 2017

@soyuka @teohhanhui I had functionnal tests.

Tell me if it is enough. The most important to me is to test of at least on filter a model like this entity.relation.embed.field.

@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 15, 2017

@soyuka @teohhanhui any news ? :-)

@@ -394,7 +393,7 @@ Feature: Date filter on collections
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
And the JSON should be equal to:
"""
{
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indentation looks wrong here but it's maybe github failing

Then the response status code should be 200
And the response should be in JSON
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
And the JSON should be equal to:
Copy link
Member

@soyuka soyuka Mar 15, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to use a schema here instead? Or you can play with JSON node should equal. It's a pain to maintain when we add more filters.

}
}
Copy link
Member

@soyuka soyuka Mar 15, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same indentation looks weird here from github POV. This is the maintain mess I'm talking about above :p.

@soyuka
Copy link
Member

soyuka commented Mar 15, 2017

Shit failed the review thing \o/. Anyway great job there! However, this has a BC break and should target master.

@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 15, 2017

@soyuka @teohhanhui , thanks for your feedback. I gonna check indentation and I will rebase to master.

Just 2 questions:

  • Why it is a BC breaks ?
  • @soyuka , can you give me more details about your comment ? I am not sure to understand

Thanks API platform Team !

@soyuka
Copy link
Member

soyuka commented Mar 15, 2017

Why it is a BC breaks ?

Because it alters methods that custom filters might use by extending our AbstractFilter.

For example, I use it with extractProperties, if I update it'll break my code because the second argument is mandatory. There was no argument before. Break.

can you give me more details about your comment ? I am not sure to understand

which one?

@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 15, 2017

@soyuka Ok , thanks for the explanation

This comment:
Would it be possible to use a schema here instead? Or you can play with JSON node should equal. It's a pain to maintain when we add more filters.

@soyuka
Copy link
Member

soyuka commented Mar 15, 2017

Oh yes, just like you did the other tests, you're using And the JSON should be valid according to this schema: instead of And the JSON should be equal to:.

When I speak about nodes you can write tests like this as well:

And the JSON node "_embedded.item" should have 1 element 

@jsamouh jsamouh force-pushed the nested-embed-field-filter branch from 2d95b70 to 9b4ef0f Compare March 16, 2017 10:54
@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 16, 2017

@soyuka , not sure of my modification according your comment but I did it in boolean_filter.feature. Can you tell me if it is ok for you before I modify my other functionnal test ?

thanks

Copy link
Member

@soyuka soyuka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The first test is correct, the other ones should match a schema instead of comparing the full json. Nice work!

Then the response status code should be 200
And the response should be in JSON
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
And the JSON should be equal to:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And the JSON should be valid according to this schema:

Then the response status code should be 200
And the response should be in JSON
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
And the JSON should be equal to:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And the JSON should be valid according to this schema:

@jsamouh
Copy link
Contributor Author

jsamouh commented Mar 16, 2017

@soyuka
ah, according your comments , you say to me to do the opposite :-)

Oh yes, just like you did the other tests, you're using And the JSON should be valid according to this schema: instead of And the JSON should be equal to

So I need to replace all my the JSON should be equal to by And the JSON should be valid according to this schema ?

@soyuka
Copy link
Member

soyuka commented Mar 16, 2017

Oh sorry about this, rephrasing :

use schema instead of full json equality for the sake of maintainability.

Really sorry that you misunderstood this I was just doing too many things at once yesterday and speaking 3 languages at the same time makes it hard to write comprehensible things sometimes :|.

@jsamouh jsamouh force-pushed the nested-embed-field-filter branch from 7f5a2d7 to 4090a85 Compare April 18, 2017 21:25
@jsamouh
Copy link
Contributor Author

jsamouh commented Apr 18, 2017

@soyuka , I revert my change about functional test to not alter the existing functional test
Let me know if it is okay for you

tags: [ { name: 'api_platform.filter', id: 'my_dummy.search' } ]

# Tests if the id default to the service name, do not add id attributes here
my_dummy.order:
parent: 'api_platform.doctrine.orm.order_filter'
arguments: [ { 'id': ~, 'name': 'desc', 'relatedDummy.symfony': ~ } ]
tags: [ { name: 'api_platform.filter' } ]
arguments: [ { 'id': ~, 'name': 'desc', 'relatedDummy.name': ~, 'embeddedDummy.dummyName': 'desc' } ]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you removed relatedDummy.symfony order, I assume this is wanted? As long as tests pass it's ok to me 👍

@soyuka
Copy link
Member

soyuka commented Apr 19, 2017

php-cs-fixer failed, you can check the diff on travis

@jsamouh jsamouh force-pushed the nested-embed-field-filter branch 2 times, most recently from 462ee9d to 40cf084 Compare April 21, 2017 14:46
@jsamouh
Copy link
Contributor Author

jsamouh commented Apr 21, 2017

@soyuka done (normally)

Copy link
Member

@meyerbaptiste meyerbaptiste left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix my comments and phpstan should be happy!

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', get_class($this), __FUNCTION__), E_USER_DEPRECATED);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your sprintf() has too many args.

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', get_class($this), __FUNCTION__), E_USER_DEPRECATED);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your sprintf() has too many args.

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', get_class($this), __FUNCTION__), E_USER_DEPRECATED);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your sprintf() has too many args.

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', get_class($this), __FUNCTION__), E_USER_DEPRECATED);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your sprintf() has too many args.

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', get_class($this), __FUNCTION__), E_USER_DEPRECATED);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your sprintf() has too many args.

@jsamouh jsamouh force-pushed the nested-embed-field-filter branch from 02370a1 to 61ec985 Compare April 28, 2017 18:34
@jsamouh
Copy link
Contributor Author

jsamouh commented Apr 28, 2017

@soyuka travis/appveyor failed is really linked to what i did ?

@soyuka
Copy link
Member

soyuka commented Apr 29, 2017

@jordscream yeah you added an embeddedDummy property I think. It fails on the following equality:

          {
            "@id": "/related_dummies/1",
            "@type": "https://schema.org/Product",
            "id": 1,
            "name": "Hello",
            "symfony": "symfony",
            "dummyDate": null,
            "thirdLevel": "/third_levels/1",
            "relatedToDummyFriend": [],
            "dummyBoolean": null,
            "age": null
          },
              {
                  "@id": "\/related_dummies\/1",
                  "@type": "https:\/\/schema.org\/Product",
                  "id": 1,
                  "name": "Hello",
                  "symfony": "symfony",
                  "dummyDate": null,
                  "thirdLevel": "\/third_levels\/1",
                  "relatedToDummyFriend": [],
                  "dummyBoolean": null,
                  "embeddedDummy": [],
                  "age": null
              },

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', __FUNCTION__), E_USER_DEPRECATED);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will have a two second argument

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', __FUNCTION__), E_USER_DEPRECATED);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will have a two second argument

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', __FUNCTION__), E_USER_DEPRECATED);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will have a two second argument

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', __FUNCTION__), E_USER_DEPRECATED);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will have a two second argument

if (__CLASS__ !== get_class($this)) {
$r = new \ReflectionMethod($this, __FUNCTION__);
if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
@trigger_error(sprintf('Method %s() will have a two `$resourceClass` argument in version API Platform 3.0. Not defining it is deprecated since API Platform 2.1.', __FUNCTION__), E_USER_DEPRECATED);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will have a two second argument

<?php

declare(strict_types=1);
/*
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There should be a blank line here.

@@ -0,0 +1,144 @@
<?php

declare(strict_types=1);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There should be a blank line here.

@blaues0cke
Copy link

blaues0cke commented May 15, 2017

Just FYI: Pointed a project I worked on for over 4 months to this pull request and everything (including the filters on embedded entities) worked like a charm without any error at all!

@dunglas
Copy link
Member

dunglas commented May 15, 2017

@jordscream do you think you can handle the last few comments?

@jsamouh
Copy link
Contributor Author

jsamouh commented May 15, 2017

@dunglas , yes will do this week :-)

@soyuka soyuka force-pushed the nested-embed-field-filter branch 3 times, most recently from b7d48bf to c29a322 Compare May 23, 2017 13:59
@soyuka
Copy link
Member

soyuka commented May 23, 2017

@jordscream just so you know (and you don't force push 😛) I fixed the last comments and rebased against master :).

@soyuka soyuka force-pushed the nested-embed-field-filter branch from c29a322 to 5dc1b08 Compare May 23, 2017 14:36
@dunglas dunglas merged commit 8ed3bdc into api-platform:master May 23, 2017
@dunglas
Copy link
Member

dunglas commented May 23, 2017

Thanks @jordscream and @soyuka!

Copy link
Member

@meyerbaptiste meyerbaptiste left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Arf too late!

*/
public function thereIsDummyObjectsWithEmbeddedDummyBoolean($nb, $bool)
{
if (in_array($bool, ['true', '1', 1], true)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about filter_var($bool, FILTER_VALIDATE_BOOLEAN)?

if (null === $bool = filter_var($bool, FILTER_VALIDATE_BOOLEAN) {
    throw new ...;
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This wasn't part of this PR or was it? I think there was a reason we didn't use that. I'll look into this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was and I don't see any reason 😛

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay so did some digging. This actually comes from #1010 and I used the same code as we already use in the BooleanFilter for consistency.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"on" / "off" support in boolean filter was removed. That's where this modification is comming from IIRC

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that I'm sure we talked about FILTER_VALIDATE_BOOLEAN when working on the boolean filter, IIRC it was with @teohhanhui.

Copy link
Member

@meyerbaptiste meyerbaptiste May 23, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I don't see what can block here. We're not talking about a filter but a setter. It's just a step definition with an argument which is converted to a pure boolean in all cases! So why couldn't we use FILTER_VALIDATE_BOOLEAN?🤔

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, can add it to my todolist.

Copy link
Contributor

@teohhanhui teohhanhui May 24, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we all stop using filter_var, please? 😞 Burn it with fire!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe with some explanations! 😛

@@ -331,7 +331,7 @@ Feature: Order filter on collections
"properties": {
"@id": {
"type": "string",
"pattern": "^/dummies/2$"
"pattern": "^/dummies/2"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why?

@@ -92,7 +92,7 @@ Feature: Create-Retrieve-Update-Delete
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
And the JSON should be equal to:
"""
{
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indentation!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, rebasing behat features is a mess. Fixed in #1137

@jsamouh
Copy link
Contributor Author

jsamouh commented May 23, 2017

@soyuka @dunglas sorry for my late
Cool to have merged :-)

hoangnd25 pushed a commit to hoangnd25/core that referenced this pull request Feb 23, 2018
…d-filter

Manage embedded fields for API Platform Filter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants