padam87 / form-filter-bundle
在 Symfony 中构建搜索表单的最简单方式。
v0.9.0
2024-08-11 21:16 UTC
Requires
- php: ^8.0
- doctrine/orm: ^2.3 || ^3.0
- symfony/config: ^6.0 || ^7.0
- symfony/dependency-injection: ^6.0 || ^7.0
- symfony/form: ^6.0 || ^7.0
README
在 Symfony 中构建搜索表单的最简单方式。
安装
composer require padam87/form-filter-bundle
用法
我的目标是创建一种比目前可用的构建搜索表单的更简单、更轻量级的方法。没有学习曲线,只有简单的抽象。该捆绑包使用内置表单类型,并提供一些额外的过滤器类型以提高便利性。
该捆绑包提供了一个表单类型扩展,并为每个类型提供两个新选项
filter
bool / callable,默认:truefilter_expr
字符串,必须是有效的 doctrine expr,默认:eq
构建表单
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\OptionsResolver\OptionsResolver; class UserFilterType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name', TextType::class) ->add('email', TextType::class) ; } public function configureOptions(OptionsResolver $resolver) { $resolver ->setDefaults( [ 'method' => Request::METHOD_GET, 'csrf_protection' => false, ] ) ; } }
正如你所见,搜索字段使用了内置的 TextType
。
控制器
$filters = $this->createForm(UserFilterType::class); $filters->handleRequest($request); $qb = $em->getRepository(User::class)->createQueryBuilder('alias'); $this->get('padam87_form_filter.filters')->apply($qb, $filters); // paginate, render template etc.
高级用法
filter_expr
- 您可以更改过滤器中使用的表达式,例如在上面的示例中,使用 like
表达式而不是 eq
会更合适。
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name', TextType::class, ['filter_expr' => 'like']) ->add('email', TextType::class, ['filter_expr' => 'like']) ; }
filter
- 过滤器选项让您完全控制字段的行为。如果简单的表达式不够用,您可以使用回调来自定义过滤器。
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name', TextType::class, ['filter_expr' => 'like']) ->add('email', TextType::class, ['filter_expr' => 'like']) ->add( 'city', TextType::class, [ 'filter' => function(QueryBuilder $qb, $alias, $value) { $qb //->join('u.address', 'a') ->andWhere($qb->expr->eq('a.city', ':city')) ->setParameter('city', $value) ; return $qb; } ] ) ; }
注意:您在这里不应使用连接,请在存储库中编写自定义方法,例如 getListQb
,并在那里连接您需要过滤的所有内容。
过滤器类型
- BooleanFilterType - 用于布尔值的 3 状态过滤器。 (简单的复选框只有 2 个状态)。
- RangeFilterType - 用于范围(数字、日期、任何其他)的过滤器
$builder ->add( 'createdAt', RangeFilterType::class, [ 'from_field_type' => DateType::class, 'from_field_options' => [ 'widget' => 'single_text', ], 'to_field_type' => DateType::class, 'to_field_options' => [ 'widget' => 'single_text', ], 'to_field_expr' => 'lt' ] ) ;