c0ntax / parsley-bundle
Symfony 和 Parsley.js 之间的桥梁
Requires
- php: ^7.1
- symfony/form: ^2.8|^3.0|^4.0
- symfony/validator: ^2.8|^3.0|^4.0
Requires (Dev)
- doctrine/annotations: ^1.6
- matthiasnoback/symfony-config-test: ^2.0
- pds/skeleton: ^1.0
- phpunit/phpunit: ^5.7
- roave/security-advisories: dev-master
- symfony/framework-bundle: ^2.8|^3.0|^4.0
- symfony/phpunit-bridge: ^2.8|^3.0|^4.0
- symfony/var-dumper: ^2.8|^3.0|^4.0
This package is auto-updated.
Last update: 2024-09-30 01:36:07 UTC
README
一个用于将 Parsley.js 集成到项目的 Symfony 扩展包
简介
如果有一种方法可以将 Symfony 表单约束 和实体注解暴露给用户作为客户端验证,那岂不是很好?是的,确实如此。使用一个备受尊重的客户端验证库来做这件事也很不错!为此,我(在写这段话前大约2年)开始考虑使用 Parsley.js 来进行验证,将 Symfony 验证转换为 parsley data-parsley-* 属性。
所以,最终,我写了一些东西。
安装
你知道的
composer require c0ntax/parsley-bundle
如果你不使用 Flex,不要忘记将以下内容添加到你的 Kernel 中
public function registerBundles() { $bundles = [ // ... new C0ntax\ParsleyBundle\C0ntaxParsleyBundle(), // ... ]; }
配置
目前,配置相对简单,你可以添加以下内容
c0ntax_parsley: enabled: true # Obviously set to false to switch it all off field: trigger: focusout # Set all fields to trigger validation on one or more jQuery events
支持的 Parsley 验证
由于这个库仍然是 alpha 版本,我还没有时间添加所有 验证,所以这里列出目前支持的验证列表
- 电子邮件
- 长度
- 最大长度
- 最小长度
- 模式
- 最大值
- 最小值
- 必填
- 范围
特定验证说明
有时,Symfony 错误消息与 Parsley 之间没有一对一的映射。这是因为在 Parsley 中,你只为验证器提供一个错误消息,该消息在运行时显示,而在 Symfony 约束中,它们可以根据未验证的内容选择特定的错误消息。以下列出了我必须选择特定错误消息的任何 Symfony 验证器,你应该使用 ConstraintErrorMessage 指令来覆盖它们(以便如果服务器端验证启动,它们仍然有合适的消息)
- 范围
用法
仅客户端验证
由于某些我无法完全理解的原因,你可能只想添加客户端验证。要做到这一点,只需在你的表单中添加一个 parsley 约束即可
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'textThing', TextType::class, [ 'parsleys' => [ new \C0ntax\ParsleyBundle\Parsleys\Directive\Field\Constraint\MinLength(2, 'You need more than %s chars'), ], ] ) ; }
上面的示例将添加一个客户端验证,以确保数据长度至少为 2 个字符
你可以添加任意数量的这些 'parsleys'
表单和客户端验证
这个用例更有意义。这是当你想明确地将约束添加到表单,并让它们在客户端和服务器端进行验证时(以防用户关闭了 JavaScript 或在您的表单上捣乱)
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'textThing', TextType::class, [ 'constrains' => [ new \Symfony\Component\Validator\Constraints\Length(['min' => 2, 'message' => 'You need more that {{ limit }} chars']), ] ] ) ; }
如果你以前使用过 Symfony 表单,你可能会注意到这里没有特别之处!幕后发生的事情是,这个库会抓取应用到表单元素上的 Symfony 约束,并将它们转换为相应的 Parsley 约束。
因此,只要存在映射(见 [支持的 Parsley 验证](#Supported Parsley Validations)),它就会自动添加到表单中。
实体注解和客户端验证
Symfony 的一个非常酷的功能是,你可以在实体本身中“配置”实体的验证。(有些人会告诉你这是不好的。他们是错的。)
这些也被库抓取,因此添加到实体中的 'assert' 将“正常工作”(tm)。
class Entity { /** * @Assert\Length(min=2) */ private $textThing; }
第三方实体注解和客户端验证
这就是我想要用这个库达到的目的。想象一下未来那个疯狂的世界,你为你的API提供了一个优雅的swagger/OAS规范。然后你使用Swagger Codegen来生成可移植的实体模型。你甚至可以调整Codegen,使其使用Symfony注解进行数据验证。好,现在,这些注解将被转换为客户端验证!太棒了!但是……swagger/OAS没有考虑到你可能想要显示给用户的错误消息。这就是ErrorMessage指令的作用所在。有了这个,你可以为那些你可能没有“控制权”的注解添加自己的错误消息。
让我们假设上面示例中的实体是你无法控制的。它是通过第三方库传入的。你可能想要给它一个特定的错误消息。
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'textThing', TextType::class, [ 'parsleys' => [ new \C0ntax\ParsleyBundle\Parsleys\Directive\Field\ConstraintErrorMessage(\C0ntax\ParsleyBundle\Parsleys\Directive\Field\Constraint\MinLength::class, 'You need more than %s chars'), ], ] ) ; }
注意 传递给标识错误消息附加位置的类是ParsleyBundle的,而不是Symfony的!
删除
有时你可能想启用Symfony和Parsley之间的桥梁,但特定验证从表单元素中“删除”。例如,在组序列的情况下,Parsley中没有等效项。通过删除,你可以“关闭”Symfony约束,并手动添加你自己的自定义Parsley验证。例如,如果我们想在服务器上有一个正则表达式symfony验证,但不在客户端上
$builder->add( 'field', TextType::class, [ 'constraints' => [new Regex(['pattern' => '/bla/]), 'parsleys' => [new RemoveSymfonyConstraint(Regex::class)],] ] );
还有RemoveParsleyDirective()类,可以用来删除特定的Parsley约束。如果你想删除自动从Symfony约束生成的某些内容,这会很有用。
自行实现
你可以通过实现DirectiveInterface来添加自己的 parsley 指令。唯一的要求是它返回一个数组,这些属性将被注入到你的表单HTML中。
就这样吗
是的,目前就是这样。如前所述,这完全是“alpha”版本,因为它目前只支持Symfony验证的一小部分……