EasyAdminBundle 过滤器功能详解
过滤器概述
EasyAdminBundle 提供了强大的过滤器功能,允许管理员在后台列表页(index页)中通过表单控件添加查询条件(如 price > 10
、enabled = true
等)来筛选数据。过滤器功能可以显著提升后台管理效率,特别是在处理大量数据时。
基本使用
在 Dashboard 或 CRUD 控制器中,通过 configureFilters()
方法定义过滤器:
namespace App\Controller\Admin;
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
class ProductCrudController extends AbstractCrudController
{
// ...
public function configureFilters(Filters $filters): Filters
{
return $filters
->add('title') // 文本过滤
->add('price') // 数字过滤
->add('published') // 布尔过滤
;
}
}
EasyAdmin 会根据属性数据类型自动选择适当的过滤器类型,但也可以显式指定:
use EasyCorp\Bundle\EasyAdminBundle\Filter\BooleanFilter;
public function configureFilters(Filters $filters): Filters
{
return $filters
->add('title')
->add('price')
->add(BooleanFilter::new('published')) // 显式指定布尔过滤器
;
}
内置过滤器类型
EasyAdmin 提供了多种内置过滤器,覆盖了常见的过滤需求:
- ArrayFilter:用于数组字段,提供等于/不等于条件和选择框
- BooleanFilter:用于布尔字段,提供"是"/"否"单选按钮
- ChoiceFilter:提供选项选择框
- ComparisonFilter:通用复合过滤器,包含两个输入字段
- DatetimeFilter:用于日期时间字段,提供条件选择和时间选择器
- EntityFilter:用于关联实体字段,提供条件选择和关联实体选择
- NullFilter:用于检查属性是否为null,提供"null"/"not null"选项
- NumericFilter:用于数字字段,提供数值比较条件和输入框
- TextFilter:用于文本字段,提供文本匹配条件和输入框
自定义过滤器
当内置过滤器无法满足需求时,可以创建自定义过滤器。自定义过滤器需要两个类:
- 配置类:实现
FilterInterface
接口,负责配置过滤器和应用查询条件 - 表单类:实现
FormType
接口,负责渲染HTML控件
自定义过滤器示例
配置类:
namespace App\Controller\Admin\Filter;
use App\Form\Type\Admin\DateCalendarFilterType;
use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Filter\FilterInterface;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FilterDataDto;
use EasyCorp\Bundle\EasyAdminBundle\Filter\FilterTrait;
class DateCalendarFilter implements FilterInterface
{
use FilterTrait;
public static function new(string $propertyName, $label = null): self
{
return (new self())
->setFilterFqcn(__CLASS__)
->setProperty($propertyName)
->setLabel($label)
->setFormType(DateCalendarFilterType::class);
}
public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void
{
if ('today' === $filterDataDto->getValue()) {
$queryBuilder->andWhere(sprintf('%s.%s = :today', $filterDataDto->getEntityAlias(), $filterDataDto->getProperty()))
->setParameter('today', (new \DateTime('today'))->format('Y-m-d'));
}
// 其他条件处理...
}
}
表单类:
namespace App\Form\Type\Admin;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;
class DateCalendarFilterType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'choices' => [
'Today' => 'today',
'This month' => 'this_month',
// 其他选项...
],
]);
}
public function getParent()
{
return ChoiceType::class;
}
}
使用自定义过滤器:
public function configureFilters(Filters $filters): Filters
{
return $filters
->add(DateCalendarFilter::new('signupDate'))
;
}
非映射过滤器
默认情况下,每个过滤器必须关联到实体的一个属性。如果需要过滤关联实体的属性(如通过客户的country属性过滤订单),需要将mapped
选项设为false
:
public function configureFilters(Filters $filters): Filters
{
return $filters
->add(CustomerCountryFilter::new('country')->setFormTypeOption('mapped', false))
;
}
最佳实践
- 合理选择过滤器类型:根据数据类型选择合适的过滤器,提升用户体验
- 性能考虑:对于大型数据集,避免使用会导致全表扫描的过滤条件
- 自定义过滤器:将常用过滤逻辑封装为自定义过滤器,提高代码复用性
- 界面友好:为过滤器提供清晰的标签和选项,降低使用门槛
通过合理使用EasyAdminBundle的过滤器功能,可以大幅提升后台管理系统的数据查询效率和用户体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考