【问题标题】:Symfony 2 Custom ConstraintsSymfony 2 自定义约束
【发布时间】:2011-12-05 22:58:33
【问题描述】:

我正在阅读 tutorial 并且有些部分我不明白:

public function validatedBy()
{
    return 'validator.unique';
}

这是一个好习惯还是我应该使用 Symfony 的默认值 get_class($this).'Validator'(来自 docs

public function requiredOptions()
{
    return array('entity', 'property');
}

public function targets()
{
    return self::PROPERTY_CONSTRAINT;
}

以上方法都需要吗?它没有出现在docs

# MyApp/MyBundle/Resources/config/services.yml
parameters:
    my.validator.unique.class:      MyApp\MyBundle\Validator\UniqueValidator

services:
    my.validator.unique:
       class:      %my.validator.unique.class%
       arguments: [@doctrine.orm.entity_manager]
       tags:
            - { name: validator.constraint_validator, alias: validator.unique }

那个参数声明只是为了让我可以使用%my.validator.unique.class%,而不是完全限定的类名吗?

关于namealias。我可以说name 是约束的“类型”。 aliasConstraint::validatedBy() 使用的别名

# Extension class
public function getAlias() {
    return 'my';
}

以上是必需的吗?我没有看到 my 在任何地方使用?

// get the existing registered namespaces for validator annotations
$namespaces = $container->getParameter('validator.annotations.namespaces');
// add our namespace under the alias myvalidation
$namespaces['myvalidation'] = 'MyApp\\MyBundle\\Validator\\';
// save it
$container->setParameter('validator.annotations.namespaces', $namespaces);

似乎@AnnotationConstraint 类中有效? validator.annotations.namespaces 给出一个关于不存在参数的错误

【问题讨论】:

    标签: validation symfony


    【解决方案1】:

    关于->validatedBy() 方法,返回一个简单的类名只有在你的验证器类没有任何依赖时才有效,因为验证器会尝试使用像new $classname() 这样简单的东西来创建它。使用服务名称的唯一问题(如果真的有问题的话......)是将约束耦合到 FrameworkBundle。

    ->getRequiredOptions() 方法默认为空,因此如果您有任何必需的选项,最好也覆盖此方法。

    ->getTargets() 方法已经默认为self::PROPERTY_CONSTRAINT。仅当您希望约束对整个类 self::CLASS_CONSTRAINT 起作用时才应覆盖它(如果您希望约束对这两种情况都起作用,您甚至可以返回一个数组)。

    在您的服务定义中,您选择使用 %my.validator.unique.class% parameter to store the class name for themy.validator.unique` 服务。

    关于->getName() 方法,它是Extension 接口的一部分。如果您决定在app/config/config.ymlmy 键下添加一些选项,它们将作为->load() 方法的第一个参数传递。

    标签的name 将被FrameworkBundle 用于查找所有约束验证器服务并将它们注册到ConstraintValidatorFactory(负责为给定约束返回正确验证器的部分)。 alias 必须与 ->validatedBy() 方法返回的字符串相同。

    你是对的,命名空间注册的东西不是必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-24
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2020-12-07
      • 2020-06-24
      • 1970-01-01
      相关资源
      最近更新 更多