我正在阅读 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
是约束的“类型”。 alias
是Constraint::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的错误
答案 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
方法返回的字符串相同。
你是对的,命名空间注册的东西不是必需的。