Как использовать ограничение EqualTo в компоненте проверки, когда данные передаются в Symfony как массив? - PullRequest
0 голосов
/ 02 ноября 2019

Symfony предоставляет способ проверки массива согласно https://symfony.com/doc/current/validation/raw_values.html, и с его помощью я хочу использовать ограничение EqualTo (https://symfony.com/doc/current/reference/constraints/EqualTo.html), которое не работает с паролем, и подтвердить регистр пароля. Пожалуйста, см. Код ниже:

$this->constraint = new Assert\Collection([
        // the keys correspond to the keys in the input array
        'fields' => [
            'password' =>
                [
                    new Assert\NotBlank(['message' => 'Please enter password.']),
                    new Assert\Length(['min' => 5, 'minMessage' => 'Please enter password of 5 characters at least.']),
                ]
            ,
            'confirm_password' =>
                [
                    new Assert\NotBlank(['message' => 'Please enter confirm password.']),
                    new Assert\EqualTo(['propertyPath' => 'password']),
                ]
            ,
        ],
        'allowMissingFields' => false,
        'missingFieldsMessage' => 'Please enter value.',
    ]);

Теперь, вызывая его:

$this->validator = Validation::createValidator();
$this->validator->validate($input, $this->constraint, $groups);

Выше не работает.

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

1 Ответ

0 голосов
/ 05 ноября 2019

Вместо Equals для использования ограничения обратного вызова

        $this->constraint = new Assert\Collection([
        // the keys correspond to the keys in the input array
        'fields' => [
            'password' =>
                [
                    new Assert\NotBlank(['message' => 'Please enter password.']),
                    new Assert\Length(['min' => 5, 'minMessage' => 'Please enter password of 5 characters at least.']),
                ]
            ,
            'confirm_password' =>
                [
                    new Assert\NotBlank(['message' => 'Please enter confirm password.']),
                    new Assert\Callback(['callback' => function ($value, ExecutionContext $ec) {
                        if ($ec->getRoot()['password'] !== $value) {
                            $ec->addViolation("Passwords do not match");
                        }
                    }])
                ]
            ,
        ],
        'allowMissingFields' => false,
        'missingFieldsMessage' => 'Please enter value.',
    ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...