Symfony2 / Doctrine - ограничение проверки, которое требует доступа к базе данных - PullRequest
3 голосов
/ 20 января 2012

У меня есть сущность ArticlePattern, у которой есть свойство pattern (строка). Мне нужно получить доступ к базе данных, чтобы проверить правильность шаблона. Поэтому я хотел бы определить метод ArticlePattern::isPatternValid() и добавить ограничение (используя аннотацию Doctrine), которое будет проверять, является ли isPatternValid истинным во время проверки объектом Validator.

Из того, что я читал здесь и там, не очень хорошая идея делать сущность зависимой от контейнера службы, что означает, что я не могу получить доступ к службе доктрины из ArticlePattern :: isPatternValid ().

Так, как я могу сделать пользовательское ограничение проверки, которому нужен доступ к базе данных? Как вы справляетесь с такими ситуациями, которые, как мне кажется, очень распространены, когда возникает так много вопросов о доступе к контейнеру услуг из класса сущностей.

EDIT:

Хорошо, спасибо, ребята, так что ответ Пользовательское ограничение проверки

Ответы [ 2 ]

5 голосов
/ 20 января 2012

Объект валидатора может быть:

  • Простой объект, который вообще не имеет никакого отношения к среде фреймворка.
  • Служба (в контексте зависимости )контейнер для инъекций ), который может сделать абсолютно все, что угодно Symfony\Component\Validator\ConstraintValidatorInterface

Так что же вам нужно делать?

  1. Определить простое ограничение
  2. Переопределить validatedBy() метод для возврата валидатора «name» (return 'my_validator';)
  3. Определить простой сервис в DIC:

    <service id="project.validator.my" class="Project\Constraints\MyValidator">
        <!-- service definition here -->
    
        <!-- the service has to be tagged -->
        <tag name="validator.constraint_validator" alias="my_validator" />
    </service>
    

EDIT

Вы спрашивали о проверке нескольких свойств.В таком случае вы можете создать валидатор, который связан с объектом, а не со свойством объекта.

  1. В вашем классе ограничений определите цель этого ограничения (свойство / класс):

    class MyConstraint ... {
        ...
    
        public function targets() {
            return self::CLASS_CONSTRAINT;
        }
    }
    
  2. Аннотировать проверенный класс вместо свойства:

    @Assert/MyConstraint(...)
    class MyClass {
        private $firstName;
        private $lastName;
    
        @Assert/Email
        private $email;
    
        ...
    }
    
  3. Сам валидатор выглядит примерно так же, как и в случаепроверка недвижимости:

    class MyValidator extends ConstraintValidator {
        public function isValid($value, Constraint $constraint) {
            // $value is an object rather a property
        }
    }
    
1 голос
/ 20 января 2012

Ваше ограничение должно переопределить базовый метод validatedBy() и вернуть идентификатор службы проверки ограничений в вашем контейнере.

public function validatedBy()
{
    return 'my_pattern_validator';
}
...