j-ben87 / parsley-bundle
将 Symfony 约束转换为 parsley 的数据属性,用于客户端验证。
v3.1.0
2023-12-15 09:18 UTC
Requires
- php: >=7.4
- psr/log: ^1.1|^2.0|^3.0
- symfony/form: ^5.4|^6.0
- symfony/framework-bundle: ^5.4|^6.0
- symfony/serializer: ^5.4|^6.0
- symfony/validator: ^5.4|^6.0
Requires (Dev)
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^1.4
- phpstan/phpstan-phpunit: ^1.0
- phpstan/phpstan-symfony: ^1.1
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.6
README
将 Symfony 约束转换为 parsley 的数据属性,用于客户端验证 Parsley。
安装
使用 composer 安装包
composer require j-ben87/parsley-bundle
安装 parsley 库: http://parsleyjs.org/doc/index.html#installation
配置
该包公开了基本的配置
jben87_parsley: enabled: true # enable/disable Parsley validation globally (can be enabled on FormType or Constraint level) trigger_event: 'blur' # the JavaScript event for which the validation is to be triggered (relative to the selected input)
用法
表单约束
创建一个 FormType
。
您在表单上定义的任何受支持的约束都将自动转换为 parsley 数据属性。
是的,就这么简单!
<?php declare(strict_types=1); namespace App\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Validator\Constraints as Assert; final class CustomType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('title', TextType::class, [ 'constraints' => [ new Assert\NotBlank(), new Assert\Length(30), ], ]) ->add('content', TextareaType::class, [ 'constraints' => [ new Assert\NotBlank(), ], ]) ; } }
结果如下
<!-- {{ form_widget(form.title) }} --> <input type="text" id="title" name="title" required="required" data-parsley-trigger="blur" data-parsley-required="true" data-parsley-required-message="This value should not be blank." data-parsley-length="[30, 30]" data-parsley-length-message="This value should have exactly 30 characters."> <!-- {{ form_widget(form.content }} --> <textarea id="content" name="content" required="required" data-parsley-trigger="blur" data-parsley-required="true" data-parsley-required-message="This value should not be blank."></textarea>
data-class
约束
创建一个 FormType
并配置其 data-class
选项。
您在类上定义的任何受支持的约束都将自动转换为 parsley 数据属性。
同样,非常简单!
<?php declare(strict_types=1); namespace App\Model; use Symfony\Component\Validator\Constraints as Assert; final class User { /** * @Assert\NotBlank() * @Assert\Length(max=255) */ private ?string $username = null; /** * @Assert\NotBlank() * @Assert\Length(max=255) * @Assert\Email() */ private ?string $email = null; }
注意:
<?php declare(strict_types=1); namespace App\Form\Type; use App\Model\User; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; final class UserType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('username') ->add('email') ; } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefault('data_class', User::class); } }
结果如下
{% {{ form_widget(form.username) }} %} <input type="text" id="username" name="username" required="required" maxlength="255" data-parsley-trigger="blur" data-parsley-required="true" data-parsley-required-message="This value should not be blank." data-parsley-maxlength="255" data-parsley-maxlength-message="This value is too long. It should have 255 characters or less."> {% {{ form_widget(form.email }} %} <input type="email" id="email" name="email" required="required" maxlength="255" data-parsley-trigger="blur" data-parsley-required="true" data-parsley-required-message="This value should not be blank." data-parsley-maxlength="255" data-parsley-maxlength-message="This value is too long. It should have 255 characters or less." data-parsley-type="email" data-parsley-type-message="This value is not a valid email address.">
注意:如果您在 FormType
和配置的 data-class
上定义了相同的约束,则 FormType
约束将覆盖 data-class
上配置的约束。
内部
ParsleyTypeExtension
是所有魔法发生的地方。
它通过注册的读取器收集所有 Symfony 约束,并通过工厂将它们转换为 parsley 约束。
它使用特殊的 ChainFactory
自动找到支持给定 Symfony 约束的第一个工厂。
最后,它将 parsley 约束规范化为数据属性,并将其与 FormView
属性合并。
扩展包
您可以通过
- 创建一个扩展抽象类
JBen87\ParsleyBundle\Constraint\Constraint
的约束来添加更多约束 - 创建一个实现接口
JBen87\ParsleyBundle\Constraint\Factory\FactoryInterface
的工厂
您的工厂将自动注册以供 ChainFactory
服务使用。
<?php declare(strict_types=1); namespace App\Constraint\Constraints; use JBen87\ParsleyBundle\Constraint\Constraint; final class Valid extends Constraint { protected function getAttribute(): string { return 'data-parsley-valid'; } protected function getValue(): string { return 'true'; } }
<?php declare(strict_types=1); namespace App\Constraint\Factory; use App\Constraint\Constraints as ParsleyAssert; use JBen87\ParsleyBundle\Constraint\Constraint; use JBen87\ParsleyBundle\Constraint\Factory\FactoryTrait; use JBen87\ParsleyBundle\Constraint\Factory\TranslatableFactoryInterface; use Symfony\Component\Validator\Constraint as SymfonyConstraint; use Symfony\Component\Validator\Constraints as Assert; final class ValidFactory implements TranslatableFactoryInterface { use FactoryTrait; public function create(SymfonyConstraint $constraint): Constraint { /** @var Assert\Valid $constraint */ return new ParsleyAssert\Valid([ 'message' => $this->trans($constraint->message), ]); } public function supports(SymfonyConstraint $constraint): bool { return $constraint instanceof Assert\Valid; } }
支持的约束
以下 Symfony 约束目前受支持
- Symfony\Component\Validator\Constraints\Date
- Symfony\Component\Validator\Constraints\DateTime
- Symfony\Component\Validator\Constraints\Email
- Symfony\Component\Validator\Constraints\GreaterThan
- Symfony\Component\Validator\Constraints\GreaterThanOrEqual
- Symfony\Component\Validator\Constraints\Length
- Symfony\Component\Validator\Constraints\LessThan
- Symfony\Component\Validator\Constraints\LessThanOrEqual
- Symfony\Component\Validator\Constraints\NotBlank
- Symfony\Component\Validator\Constraints\Range
- Symfony\Component\Validator\Constraints\Time
- Symfony\Component\Validator\Constraints\Type
- Symfony\Component\Validator\Constraints\Url
接下来是什么
- 支持更多约束
- 支持分组验证