Symfony 2 Пользовательские ограничения - PullRequest
1 голос
/ 05 декабря 2011

Я читаю учебник , и есть некоторые части, которые я не понимаю:

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

Это хорошая практика или я должен просто использовать Symfony по умолчаниюиз get_class($this).'Validator' (из документов )

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

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

Требуются ли вышеуказанные методы?Он не появляется в документах

# 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 выдает ошибку о несуществующем параметре

1 Ответ

2 голосов
/ 05 декабря 2011

О методе ->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 app/config/config.yml, они будут переданы в качестве первого аргумента метода ->load().

name тега будет использоватьсяFrameworkBundle, чтобы найти все службы проверки ограничений и зарегистрировать их в ConstraintValidatorFactory (часть, которая отвечает за возврат правильного средства проверки для данного ограничения).alias должна совпадать со строкой, возвращаемой методом ->validatedBy().

И вы правы, в регистрации пространства имен нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...