PHPackages                             lshamanl/symfony-ui-bundle-query - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. lshamanl/symfony-ui-bundle-query

Abandoned → [intellect-web-development/symfony-presentation-bundle](/?search=intellect-web-development%2Fsymfony-presentation-bundle)Symfony-bundle[API Development](/categories/api)

lshamanl/symfony-ui-bundle-query
================================

Symfony UI Bundle Query (Filters, Sorts, Pagination, One Resource)

0.3.1(4y ago)0131BSD-3-ClausePHPPHP &gt;=8.0

Since Oct 21Pushed 4y ago1 watchersCompare

[ Source](https://github.com/lShamanl/symfony-ui-bundle-query)[ Packagist](https://packagist.org/packages/lshamanl/symfony-ui-bundle-query)[ RSS](/packages/lshamanl-symfony-ui-bundle-query/feed)WikiDiscussions master Synced 3w ago

READMEChangelog (10)Dependencies (21)Versions (17)Used By (0)

Symfony UI Bundle Query
=======================

[](#symfony-ui-bundle-query)

Описание:
---------

[](#описание)

Данный пакет является Симфони-бандлом.

Проблема, которую решает данный пакет: Снимает с разработчика необходимость писать повторяющийся код в UI-точках входа в приложение(Controllers, CommandBus), далее Controller.

Пример внешнего использования:
------------------------------

[](#пример-внешнего-использования)

### Пример строки запроса:

[](#пример-строки-запроса)

```
GET /clients?filter[emails.email][like]=26d@&sort=-createdAt,updatedAt&page[number]=1&page[size]=20&filter[userId][eq]=ccf92b7a-8e05-4f4b-9f0a-e4360dbacb23&filter[name.translations.last][eq]=Tesla&lang=ru
```

### Контракты:

[](#контракты)

#### Сортировка:

[](#сортировка)

##### Описание:

[](#описание-1)

Сортировка задается параметром "sort". Направление сортировки задается опциональным знаком '-' перед названием свойства, по которому предполагается сортировка. Если знак '-' присутствует, то сортировка по этому полю ведется с модификатором DESC, иначе - ASC. Допускается сортировка по нескольким полям агрегата. Для этого необходимо написать несколько полей, разделив их символом ','. Чем раньше было указано поле, тем больший "вес" оно имеет при выборке.

##### Пример:

[](#пример)

```
sort='-createdAt,updatedAt'

```

#### Пагинация:

[](#пагинация)

#### Сортировка:

[](#сортировка-1)

Пагинация задается параметром "page". Параметр имеет два поля - number и size.

- "number" указывает на номер страницы, которую запрашивает клиент. По умолчанию: 1
- "size" указывает размер страницы(сколько агрегатов должно быть отображено). По умолчанию: 20

##### Описание:

[](#описание-2)

```
page[number]='1'
page[size]='20'

```

#### Фильтрация:

[](#фильтрация)

##### Описание:

[](#описание-3)

Операторы поиска:

НазваниеДопустимые значенияПримерОписаниеNOT\_IN'not-in'filter\[status\]\[not-in\]\[\]='blocked'Свойство не содержит ни одно из указанных значенийIN'in'filter\[status\]\[in\]\[\]='active'Свойство содержит одно из указанных значенийRANGE'range'filter\[rating\]\[range\]='17,42'Свойство находится в выбранном указанном диапазонеIS\_NULL'is-null'filter\[gender\]\[is-null\]Свойство равно nullNOT\_NULL'not-null'filter\[name\]\[not-null\]Свойство не равно nullLESS\_THAN'less-than', '&lt;', 'lt'filter\[rating\]\[&lt;\]='94'Свойство меньше указанного значенияGREATER\_THAN'greater-than', '&gt;', 'gt'filter\[rating\]\[&gt;\]='42'Свойство больше указанного значенияLESS\_OR\_EQUALS'less-or-equals', '&lt;=', 'lte'filter\[rating\]\[&lt;=\]='15'Свойство меньше или равно указанному значениюGREATER\_OR\_EQUALS'greater-or-equals', '&gt;=', 'gte'filter\[rating\]\[&gt;=\]='97'Свойство больше или равно указанному значениюLIKE'like'filter\[email\]\[like\]='26d@'Свойство содержит часть указанного значенияNOT\_LIKE'not-like'filter\[email\]\[not-like\]='27d@'Свойство не содержит часть указанного значенияEQUALS'equals', '=', 'eq'filter\[userId\]\[eq\]='ccf92b7a-8e05-4f4b-9f0a-e4360dbacb23'Свойство эквивалентно указанному значениюNOT\_EQUALS'not-equals', '!=', '&lt;&gt;', 'neq'filter\[userId\]\[neq\]='aaf92b7a-8e05-4f4b-9f0a-e4360dbacb23'Свойство не эквивалентно указанному значению##### Пример:

[](#пример-1)

```
filter[userId][eq]='ccf92b7a-8e05-4f4b-9f0a-e4360dbacb23'
filter[name.translations.last][eq]='Tesla'
filter[emails.email][like]='26d@'
filter[userId][eq]='ccf92b7a-8e05-4f4b-9f0a-e4360dbacb23'
filter[name.translations.last][eq]='Tesla'
filter[emails.email][in][]='0791d11b6a952a3804e7cb8a220d0a9b@mail.ru'
filter[emails.email][in][]='0891d11b6a952a3804e7cb8a220d0a9b@mail.ru'

```

Внутреннее использование:
-------------------------

[](#внутреннее-использование)

### Query:

[](#query)

#### Aggregate:

[](#aggregate)

Пример Read-action:

```
use App\Path\To\Entity;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Nelmio\ApiDocBundle\Annotation\Model;
use SymfonyBundle\UIBundle\Foundation\Core\Contract\ApiFormatter;
use SymfonyBundle\UIBundle\Foundation\Core\Dto\OutputFormat;
use SymfonyBundle\UIBundle\Query\Core\CQRS\Query\Aggregate\Processor as AggregateProcessor;
use SymfonyBundle\UIBundle\Query\Core\CQRS\Query\Aggregate\Context as AggregateContext;

class Controller {
    /**
     * @Route("/{id}.{_format}", methods={"GET"}, name=".read", defaults={"_format"="json"})
     * @OA\Response(
     *     response=200,
     *     description="Read Entity",
     *     @OA\JsonContent(
     *         allOf={
     *             @OA\Schema(ref=@Model(type=ApiFormatter::class)),
     *             @OA\Schema(type="object",
     *                 @OA\Property(
     *                     property="data",
     *                     type="object",
     *                     @OA\Property(
     *                         property="entity",
     *                         ref=@Model(type=UseCase\CommonOutputContract::class)
     *                     )
     *                 ),
     *                 @OA\Property(
     *                     property="status",
     *                     example="200"
     *                )
     *             )
     *         }
     *     )
     * )
     */
    public function read(
        string $id,
        AggregateProcessor $processor,
        OutputFormat $outputFormat
    ): Response {
        $context = new AggregateContext(
            outputFormat: $outputFormat->getFormat(),
            entityId: $id,
            targetEntityClass: User::class,
            outputDtoClass: UseCase\CommonOutputContract::class,
        );

        $processor->process($context);
        return $processor->makeResponse();
    }
```

#### Search:

[](#search)

Пример Search-action:

```
use App\Path\To\Entity;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Nelmio\ApiDocBundle\Annotation\Model;
use SymfonyBundle\UIBundle\Foundation\Core\Contract\ApiFormatter;
use SymfonyBundle\UIBundle\Foundation\Core\Dto\OutputFormat;
use SymfonyBundle\UIBundle\Query\Core\Contract\Filter\FilterSortPagination;
use SymfonyBundle\UIBundle\Query\Core\CQRS\Query\Search\Processor as SearchProcessor;
use SymfonyBundle\UIBundle\Query\Core\CQRS\Query\Search\Context as SearchContext;
use SymfonyBundle\UIBundle\Query\Core\Service\Filter\SearchQuery;

class Controller {
    /**
     * @Route(".{_format}", methods={"GET"}, name=".search", defaults={"_format"="json"})
     * @OA\Get(
     *     @OA\Parameter(
     *          name="searchParams",
     *          in="query",
     *          required=false,
     *          @OA\Schema(
     *              ref=@Model(type=FilterSortPagination::class)
     *          ),
     *     )
     * )
     * @OA\Response(
     *     response=200,
     *     description="Search by Users",
     *     @OA\JsonContent(
     *          allOf={
     *              @OA\Schema(ref=@Model(type=ApiFormatter::class)),
     *              @OA\Schema(type="object",
     *                  @OA\Property(
     *                      property="data",
     *                      type="object",
     *                      @OA\Property(
     *                          property="entities",
     *                          ref=@Model(type=UseCase\CommonOutputContract::class)
     *                      )
     *                  ),
     *                  @OA\Property(
     *                      property="status",
     *                      example="200"
     *                 )
     *              )
     *          }
     *      )
     * )
     */
    public function search(
        SearchProcessor $processor,
        SearchQuery $searchQuery,
        OutputFormat $outputFormat
    ): Response {
        $context = new SearchContext(
            targetEntityClass: User::class,
            outputFormat: $outputFormat->getFormat(),
            outputDtoClass: UseCase\CommonOutputContract::class,
            filterBlackList: ['id'],
            pagination: $searchQuery->getPagination(),
            filters: $searchQuery->getFilters(),
            sorts: $searchQuery->getSorts()
        );

        $processor->process($context);

        return $processor->makeResponse();
    }
}
```

###  Health Score

25

—

LowBetter than 35% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity10

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~6 days

Total

14

Last Release

1638d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/19c137bc2dc0dd342a47f118b8f230e09947f81b1b78538b667d64a2762e058e?d=identicon)[lShamanl](/maintainers/lShamanl)

---

Top Contributors

[![lShamanl](https://avatars.githubusercontent.com/u/43775931?v=4)](https://github.com/lShamanl "lShamanl (23 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Psalm

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/lshamanl-symfony-ui-bundle-query/health.svg)

```
[![Health](https://phpackages.com/badges/lshamanl-symfony-ui-bundle-query/health.svg)](https://phpackages.com/packages/lshamanl-symfony-ui-bundle-query)
```

###  Alternatives

[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k17.9M388](/packages/easycorp-easyadmin-bundle)[open-dxp/opendxp

Content &amp; Product Management Framework (CMS/PIM)

9421.6k61](/packages/open-dxp-opendxp)[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.5k5.9M737](/packages/sylius-sylius)[2lenet/crudit-bundle

The easy like Crud'it Bundle.

1616.4k14](/packages/2lenet-crudit-bundle)[oro/platform

Business Application Platform (BAP)

645143.5k115](/packages/oro-platform)[pimcore/pimcore

Content &amp; Product Management Framework (CMS/PIM/E-Commerce)

3.8k3.8M508](/packages/pimcore-pimcore)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
