Symfony 2自定义约束

时间:2011-12-05 14:08:43

标签: validation symfony

我正在阅读 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%而不是完全限定的类名吗?

关于name& alias。我是正确的说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);

@Annotation课程似乎只有Constraint吗? validator.annotations.namespaces给出了关于不存在的param的错误

1 个答案:

答案 0 :(得分:2)

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

默认情况下->getRequiredOptions()方法为空,因此如果您有任何必需的选项,那么这也是一个很好的做法,也可以覆盖此方法。

->getTargets()方法已默认为self::PROPERTY_CONSTRAINT。只有当你希望约束在整个类self::CLASS_CONSTRAINT上工作时才应该覆盖它(如果你希望你的约束适用于这两种情况,你甚至可以返回一个数组)。

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

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

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

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