1. Go to this page and download the library: Download silpo-tech/filter-bundle library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
silpo-tech / filter-bundle example snippets
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
new FilterBundle\FilterBundle(),
);
}
namespace App\Controller;
use App\DTO\Request\Location\LocationFilter;
use App\DTO\Request\Location\LocationOrder;
use FilterBundle\Request\FilterValueResolver;
use PaginatorBundle\Paginator\OffsetPaginator;
use PermissionBundle\Configuration\Permissions;
use RestBundle\Controller\RestController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use FilterBundle\Annotation\FilterMapper;
class ListAction
{
public function __construct(private readonly LocationRepository $repository)
{
}
#[Route(path: 'v1/action/entities', name: ListAction::class, methods: [Request::METHOD_GET])]
public function all(
#[FilterMapper]
LocationFilter $filter,
#[FilterMapper]
LocationSort $order,
OffsetPaginator $offsetPaginator
): Response {
return $this->createPaginatedResponse(
$this->repository->findWithConditions($filter, $order),
$offsetPaginator,
LocalizedLocationDto::class
);
}
}
namespace App\Repository;
use App\DTO\Request\Location\LocationFilter;
use App\DTO\Request\Location\LocationOrder;
use App\Entity\Location;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
use FilterBundle\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
use FilterBundle\Service\ConditionBuilder;
use Hubber\LazyLib\EntityCollection;
class EntityRepository extends ServiceEntityRepository
{
public const ALIAS = 'entity';
public function __construct(ManagerRegistry $registry, private ConditionBuilder $conditionBuilder)
{
parent::__construct($registry, Entity::class);
}
public function findWithConditions(EntityDTOFilter $filter): EntityCollection
{
$queryNameGenerator = new QueryNameGenerator();
$qb = $this->createQueryBuilder(self::ALIAS);
$this->conditionBuilder->applyFilters($qb, $queryNameGenerator, $this->getClassName(), $filter);
return new EntityCollection($qb);
}
}
namespace App\Dto\Request\Entity;
use FilterBundle\Annotation\ApiFilter;
use FilterBundle\Bridge\Doctrine\Orm\BooleanFilter;use FilterBundle\Bridge\Doctrine\Orm\SearchFilter;
use FilterBundle\Bridge\Doctrine\Orm\LocaleFilter;
use FilterBundle\Bridge\Doctrine\Orm\OrderFilter;
use FilterBundle\Validator\Constraints\ValidDateRange;
use FilterBundle\Validator\Constraints\DateRangeBeforeGreaterThanAfter;
use FilterBundle\Validator\Constraints\DateRangeBeforeNotEqualsAfter;
use Symfony\Component\Validator\Constraints as Assert;
#[ApiFilter(LocaleFilter::class, property: 'translations.locale')]
class EntityDTOFilter
{
#[ApiFilter(SearchFilter::class, property: 'parents.id', strategy: SearchFilter::STRATEGY_EXACT)]
#[Assert\Uuid]
/** @var string */
public $parentId;
#[Assert\Sequentially(constraints: [
new Assert\Type(type: 'string'),
new Assert\Uuid(versions: [Assert\Uuid::V6_SORTABLE]),
])]
#[ApiFilter(SearchFilter::class, property: 'nullableId', strategy: 'exact')]
#[ApiFilter(NullFilter::class, property: 'nullableId')]
/** @var string|null */
public $nullableId = null;
#[ApiFilter(BooleanFilter::class)]
/** @var boolean */
public $active = true;
#[Assert\Sequentially(
constraints: [
new Assert\NotBlank(),
new Assert\Choice(callback: [EntityStatus::class, 'getChoices'], multiple: true)
]
)]
#[ApiFilter(SearchFilter::class, property: 'status', strategy: SearchFilter::STRATEGY_EXACT)]
/** @var array */
public $status = [];
#[ApiFilter(DateFilter::class, property: 'createdAt')]
#[ValidDateRange(format: 'Y-m')]
#[DateRangeBeforeGreaterThanAfter]
#[DateRangeBeforeNotEqualsAfter]
/** @var array */
public $createdAt = [];
#[Assert\Type('array')]
#[ApiSort(
filterClass: OrderFilter::class,
map: ['id' => 'id', 'status' => 'status', 'createdAt' => 'createdAt', 'updatedAt' => 'updatedAt']
)]
/** @var string[] */
public $sort = ['-id'];
}
use FilterBundle\Annotation\ApiFilter;
use FilterBundle\Bridge\Doctrine\Orm\DateFilter;
class EntityDTOFilter
{
#[ApiFilter(DateFilter::class, property: 'deletedAt', arguments: ['nullManagement' => 'exclude_null'])]
/** @var array */
public $deletedAt = [];
#[ApiFilter(DateFilter::class, property: 'archivedAt', arguments: ['nullManagement' => '