j-ben87/parsley-bundle

将 Symfony 约束转换为 parsley 的数据属性,用于客户端验证。

安装: 28,309

依赖者: 0

建议者: 0

安全: 0

星星: 14

关注者: 4

分支: 11

开放问题: 0

类型:symfony-bundle

v3.1.0 2023-12-15 09:18 UTC

This package is auto-updated.

Last update: 2024-09-15 10:58:41 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

将 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

接下来是什么

  • 支持更多约束
  • 支持分组验证