Skip to content

Please provide a migration path for the ApiFilter attribute => query parameter.Β #7554

@VincentLanglet

Description

@VincentLanglet

Description
Hi @soyuka @vinceAmstoutz

I'm currently trying to migrate my ApiFilter attribute filters to avoid the futur deprecation, as explained in
https://api-platform.com/docs/core/doctrine-filters/#introduction

But I'm currently having big trouble to understand

  • How to migrate some of my filters
  • What's the benefit

And I feel like I'm maybe not the only one, looking at some recent issue/discussions.

Also I think this Upgrade note could explain with more details why this changes, cause currently I didn't found satisfying explanations.
I feel like the ApiFilter attribute will be replaced by

  • The new filters classes (great)
  • Declaring filter in the yaml/php config (why ? I hate having to maintain a config)
  • Creating new dedicated filter (why having to maintain my own filter while ApiPlatform filters was doing the trick ?)

I understand writing doc is difficult and I'm open to do PR to improve it, but first I need to understand it ^^'

Example

I would expect a big list of BEFORE/AFTER example.
I'm unsure how to write it currently, based on the issues I encounter.

Problem I still have

  1. I have an OrderFilter
#[ApiFilter(OrderFilter::class, properties: ['name', 'createdAt'])]

that's I tried to migrated

parameters: ['order[:property]' => new QueryParameter(filter: new OrderFilter(), properties: ['name', 'createdAt'])],

it worked fine BUT got the same issue than #7361

I follow the suggestion from soyuka (#7361 (comment)) to use service id with .instance

parameters: ['order[:property]' => new QueryParameter(filter: 'api_platform.doctrine.orm.order_filter.instance', properties: ['name', 'createdAt'])],

but then the filter does nothing as reported by #7361 (comment)

Looking at #7361 (comment) I feel like I'll have to declare a new service in my config. Is it the only way ? Is it plan to introduce a new OrderFilter ?

  1. I have a filter with nested property
#[ApiFilter(SearchFilter::class, properties: ['languagePair.target' => 'exact'])]

As reported #7121 (comment) and answered by soyuka, nested properties are (voluntary) not supported anymore for those filters.
This is already discussed in #7526

Filtering on nested properties requires joins which is hard to predict and may lead to unwanted behavior / performance issues, can't you create your own filter?

I have a big trouble understanding

  • What was the issue before (since it works)
  • How my own filter will avoid this issue (since I'll have to make my own JOIN !)

Wouldn't it be possible to still support nested properties ? Or to do somehting like OrFilter:

new NestedFilter(new ExactFilter())

Also soyuka told me I can still use the legacy (not recommended) SearchFilter but I got the same issue than the OrderFilter, something like

parameters: [
                'targetLanguage' => new QueryParameter(
                    filter: 'api_platform.doctrine.orm.search_filter.instance',
                    property: 'languagePair.target'
                ),
            ]

does nothing...

Problem solved that might help someone else...

  1. I have a BooleanFilter on a live property I tried to migrate to
parameters: ['live' => new QueryParameter(filter: new BooleanFilter(), property: 'live')],

it worked fine BUT got the same issue than #7361

I'm finally solve my issue with

parameters: ['live' => new QueryParameter(filter: new ExactFilter(), property: 'live')],

but I'm not sure of the changes.

  1. I have a SearchFilter
#[ApiFilter(SearchFilter::class, properties: ['name' => 'partial'])]

that I migrated into

parameters: ['name' => new QueryParameter(filter: new PartialSearchFilter(), property: 'name')],

I feel like it's the right way to do it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions