Skip to content

Latest commit

 

History

History
95 lines (78 loc) · 3.02 KB

example_definition.md

File metadata and controls

95 lines (78 loc) · 3.02 KB

Example Filter Definitions

Please note: all filters are DB aware, so don't mix Doctrine and Mongo filters in same definition.

namespace AppBundle\Filter\Definition;

use App\Filter\DataType\StringDataType;
use App\Filter\Definition\BaseFilterDefinition;
use App\Filter\Definition\FilterDefinitionInterface;
use App\Filter\Filter\FilterConfiguration;
use App\Filter\Filter\Mongo\ExactFilter;
use App\Filter\Pagination\PaginationConfiguration;
use App\Filter\Sort\SortConfiguration;
use App\Filter\Sort\SortDefinition;

class UserFilterDefinition extends BaseFilterDefinition implements FilterDefinitionInterface
{
public function getPaginationConfiguration(): ?PaginationConfiguration
{
    {
        return new PaginationConfiguration(25, 100);
    }

    public function getFilterConfiguration(): FilterConfiguration
    {
        return new FilterConfiguration([
            new ExactFilter('first_name', StringDataType::class, 'a.first_name', ['index' => 1]),
            new ExactFilter('last_name', StringDataType::class, 'a.last_name', ['index' => 2]),
            new ExactFilter('email', StringDataType::class, 'a.email', ['index' => 3]),
        ]);
    }

    public function getSortConfiguration(): SortConfiguration
    {
        return new SortConfiguration([
            new SortDefinition('first_name', 'a.first_name', 1, SortDefinition::SORT_ASC),
        ]);
    }

    public function getDefaultFilterConfiguration(Request $request): FilterConfiguration
    {
        return new FilterConfiguration([
            new ExactFilter('first_name', StringDataType::class, 'a.first_name', ['index' => 1], 'Bob'),
        ]);
    }

    public function getPredefinedFilterConfiguration(Request $request): FilterConfiguration
    {
        return new FilterConfiguration([
            new ExactFilter('email', StringDataType::class, 'a.email', ['index' => 3], 'bob@test.com'),
        ]);
    }
}

Register your definition as a service:

  AppBundle\Filter\Definition\UserFilterDefinition:
    class: AppBundle\Filter\Definition\UserFilterDefinition
    arguments:
      - '@App\Repository\UserRepository'
      - '@App\Transformer\UserTransformer'

Or for Symfony 4.0, even with auto wiring, you need to type hint which services you want

  AppBundle\Filter\Definition\UserFilterDefinition:
    class: AppBundle\Filter\Definition\UserFilterDefinition
    arguments:
      $repository: '@App\Repository\UserRepository'
      $transformer: '@App\Transformer\UserTransformer'

Doctrine ORM

Implement App\Filter\Definition\DoctrineORMFilterDefinitionInterface , requires getQueryBuilder method in addition to the standard fields from the FilterDefinitionInterface.

A sample of this method:

    public function getQueryBuilder(EntityRepository $repository) : QueryBuilder
    {
        $qb = $repository
            ->createQueryBuilder('user')
            ->select('user')
            ->where('1 = 1');

        return $qb;
    }

Please note 1 = 1 is required as all filter conditions are added as andWhere clauses.