c0ntax/parsley-bundle

Symfony 和 Parsley.js 之间的桥梁

安装次数: 7,994

依赖项: 0

建议者: 0

安全性: 0

星标: 3

关注者: 1

分支: 0

开放性问题: 4

类型:symfony-bundle

0.6.3 2019-11-21 11:37 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验证的一小部分……