[Laravel] OrFilter throws when an array query parameter has exactly one value
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 88/100
Direzione di ricerca
Inizia da ApiPlatform\Laravel\Eloquent\Filter\OrFilter::apply() e confronta la gestione dei suoi input con FilterQueryExtension::apply(). Riproduci il problema con uno e più valori di tags, quindi verifica che entrambe le richieste eseguano correttamente il filtro senza l’errore foreach.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
API Platform version(s) affected: 4.3.19
Description
ApiPlatform\Laravel\Eloquent\Filter\OrFilter::apply() always iterates its $values argument with foreach ($values as $value).
ApiPlatform\Laravel\Eloquent\Extension\FilterQueryExtension::apply(), flattens a single-element list array down to a scalar before calling any filter:
// most eloquent filters work with only a single value
if (\is_array($values) && array_is_list($values) && 1 === \count($values)) {
$values = current($values);
}
That's true for most filters, which take a single value directly. It isn't true for OrFilter, which always expects an array to iterate. So a QueryParameter using OrFilter throws the moment a request supplies exactly one value for the array-typed parameter, instead of filtering on it.
How to reproduce
'tags' => new QueryParameter(
schema: ['type' => 'array', 'items' => ['type' => 'integer']],
filter: new OrFilter(new EqualsFilter),
property: 'tag_id',
),
GET /books?tags[]=1&tags[]=2works.GET /books?tags[]=1(a single value) throws:
ErrorException: foreach() argument must be of type array|object, string given
at vendor/api-platform/laravel/Eloquent/Filter/OrFilter.php:36
Possible Solution
Normalize the input before iterating in ApiPlatform\Laravel\Eloquent\Filter\OrFilter::apply():
return $builder->where(function (Builder $builder) use ($values, $parameter, $context): void {
foreach (\Illuminate\Support\Arr::wrap($values) as $value) {
$this->filter->apply($builder, $value, $parameter, ['whereClause' => 'orWhere'] + $context);
}
});
rather than relying on every caller of FilterQueryExtension to never send OrFilter a single value.
- Lingua principale
- PHP
- Stelle
- 2.6k
- Fork
- 984
- Merge medio
- 1g 17h
- PR unite (30g)
- 84
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di api-platform/core
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
api-platform/core#8475 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 38/100
api-platform/core#8591 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
api-platform/core#8535 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
api-platform/core#8499 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
api-platform/core#8494 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di api-platform/core
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 2 giorni
-
UX
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
ProfessionalWiki/NeoWiki#1573 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
endoflife-date/endoflife.date#11194 ·
I maintainer di solito rispondono entro 1 giorno