Как использовать замыкания в компоненте проверки в Symfony2? - PullRequest
2 голосов
/ 06 сентября 2011

Не могли бы вы поделиться со мной примером использования замыканий в компоненте проверки в Symfony2?

Я использую этот код для проверки $ prop:

use Symfony\Component\Validator\Constraints as Assert;

class A
{
    /**
     * @Assert\NotBlank()
     * @Assert\Choice(choices = {"value1", "value2"})
     */
    private $prop;
}

Я хочу использовать замыканиекак показано в документации с опцией "обратного вызова".Некоторое время я гуглил, но пока не нашел примеров.

1 Ответ

3 голосов
/ 06 сентября 2011

Чтобы использовать замыкание, вам нужно определить метаданные проверки с использованием PHP (в отличие от YAML, XML или аннотаций).Для примера взгляните на вкладку «PHP» первого примера на странице, на которую вы ссылаетесь.Он использует loadValidatorMetadata.

Вот как это будет выглядеть с набором обратного вызова:

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\Choice;

class Author
{
    protected $gender;

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('gender', new Choice(
            'message' => 'Choose a valid gender',
            'callback' => function () {
                return array('male', 'female');
            },
        ));
    }
}

Как видите, он не очень хорошо работает.Основная проблема в том, что статический метод loadValidatorMetadata на самом деле не имеет никакого доступа к внешнему миру.

Если вы настаиваете на использовании замыканий, вы можете создать отдельную реализацию Symfony\Component\Validator\Mapping\Loader\LoaderInterface.Но, честно говоря, проще всего просто использовать обратный вызов с именем метода экземпляра, как показано в примере с getGenders.

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