Почему Symfony2 валидация свойстваPath Valus в квадратных скобках? - PullRequest
5 голосов
/ 09 декабря 2011

Я проверяю некоторые значения:

$collectionConstraint = new Collection(array(
    'email' => array(
        new NotBlank(),
        new Email(),
    ),
    'password'  => array(
         new NotBlank(),
         new MinLength(array('limit' => 6)),
         new MaxLength(array('limit' => 25)),
    ),
));
$data = array('email' => $this->getRequest()->get('email'), 'password' => $this->getRequest()->get('password'));
$errors = $this->get('validator')->validateValue($data, $collectionConstraint);

Но по какой-то причине поля (propertyPath) хранятся в квадратных скобках - я хотел бы понять, почему Sf делает это. Я должен вручную удалить все скобки, что кажется абсурдным, поэтому я думаю, что где-то отсутствует какая-то функциональность.

Сброс ошибок $:

Symfony\Component\Validator\ConstraintViolationList Object
(
    [violations:protected] => Array
        (
            [0] => Symfony\Component\Validator\ConstraintViolation Object
                (
                    [messageTemplate:protected] => This value should not be blank
                    [messageParameters:protected] => Array
                        (
                        )

                    [root:protected] => Array
                        (
                            [email] => 
                            [password] => 
                        )

                    [propertyPath:protected] => [email]
                    [invalidValue:protected] => 
                )

            [1] => Symfony\Component\Validator\ConstraintViolation Object
                (
                    [messageTemplate:protected] => This value should not be blank
                    [messageParameters:protected] => Array
                        (
                        )

                    [root:protected] => Array
                        (
                            [email] => 
                            [password] => 
                        )

                    [propertyPath:protected] => [password]
                    [invalidValue:protected] => 
                )

        )

)

Даже функция toString бесполезна.

"[email]: This value should not be blank","[password]: This value should not be blank"

Ответы [ 2 ]

5 голосов
/ 29 мая 2012

Пути к свойствам могут отображаться либо на свойства, либо на индексы.Рассмотрим класс OptionBag, который реализует \ArrayAccess и метод getSize().

  • Путь свойства size ссылается на $optionBag->getSize()
  • Путь свойства [size]относится к $optionBag['size']

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

Обновление:

Вам не нужно удалять квадрат вручнуюскобки.Вы можете использовать компонент PropertyAccess Symfony для сопоставления ошибок с массивом, структура которого совпадает с вашими данными, например:

$collectionConstraint = new Collection(array(
    'email' => array(
        new NotBlank(),
        new Email(),
    ),
    'password'  => array(
         new NotBlank(),
         new MinLength(array('limit' => 6)),
         new MaxLength(array('limit' => 25)),
    ),
));

$data = array(
    'email' => $this->getRequest()->get('email'), 
    'password' => $this->getRequest()->get('password')
);

$violations = $this->get('validator')->validateValue($data, $collectionConstraint);

$errors = array();
$accessor = $this->get('property_accessor');

foreach ($violations as $violation) {
    $accessor->setValue($errors, $violation->getPropertyPath(), $violation->getMessage());
}

=> array(
    'email' => 'This value should not be blank.',
    'password' => 'This value should have 6 characters or more.',
)

Это также работает с многомерными массивами данных.Там пути к свойствам будут выглядеть примерно так: [author][name].PropertyAccessor вставит сообщения об ошибках в том же месте в массиве $errors, то есть $errors['author']['name'] = 'Message'.

1 голос
/ 28 мая 2019

PropertyAccessor's setValue не поможет, поскольку не может обработать несколько нарушений для одного поля.Например, поле может быть короче длины ограничения и также содержать недопустимые символы.Для этого у нас будет два сообщения об ошибках.

Мне пришлось создать свой собственный код:

$messages = [];

foreach ($violations as $violation) {

    $field = substr($violation->getPropertyPath(), 1, -1);
    $messages[] = [$field => $violation->getMessage()];
}

$output = [
    'name' => array_unique(array_column($messages, 'name')),
    'email' => array_unique(array_column($messages, 'email')),
];

return $output;

Мы вручную удаляем символы [] из пути свойства и создаем массив массивов полей и соответствующих сообщений.Позже мы преобразуем массив для группировки сообщений по полям.

$session = $request->getSession();
$session->getFlashBag()->setAll($messages);

В контроллере мы добавляем сообщения во флэш-пакет.

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