Ограничение Symfony Validator Collection не работает с группами - PullRequest
0 голосов
/ 13 февраля 2019

Я попытался проверить входной массив.Массив должен быть проверен на основе различных условий, есть ограничение type, которое должно быть выполнено при каждом запросе, а затем другие (google, credentials и facebook), которые зависят от значения запроса.

Итак, мое ограничение следующее:

/* ... */
$this->validator = Validation::createValidator();

$this->rules = [
    "type" => new Assert\Choice([
        "choices" => ["credentials", "facebook", "google"],
        "message" => "Invalid type '{{ value }}'. Must be one of: credentials, facebook or google",
        "min" => 1,
        "max" => 1
    ]),
    "username" => [
        new Assert\NotBlank([]),
        new Assert\Regex([
            "pattern" => "/^[\w0-9\ ]+$/i",
            "message" => "Username can only consist of alphanumeric characters, spaces, _, ., -"
        ])
    ],
    "token" => new Assert\NotBlank([]),
    "password" => [
        new Assert\NotBlank([]),
        new Assert\Length([
            "min" => 6,
            "minMessage" => "Password must be at least 6 characters long",
        ]),
    ],
    "passwordConfirm" => [
        new Assert\NotBlank([]),
        new Assert\IdenticalTo([
            "propertyPath" => "password",
        ])
    ]
];

$this->constraints = [
    new Assert\Collection([
        "groups" => ["Default", "type"],
        "fields" => [
            "type" => $this->rules["type"]
        ]
    ]),
    new Assert\Collection([
        "groups" => ["Default", "facebook", "google", "credentials"],
        "fields" => [
            "username" => $this->rules["username"]
        ]
    ]),
    new Assert\Collection([
        "groups" => ["Default", "facebook", "google"],
        "fields" => [
            "token" => $this->rules["token"]
        ]
    ]),
    new Assert\Collection([
        "groups" => ["Default", "credentials"],
        "fields" => [
            "password" => $this->rules["password"],
            "passwordConfirm" => $this->rules["passwordConfirm"]
        ]
    ]),
];

$this->validator->validate($data, $this->constraints, ["type", $data["type"] ?? "null"]);

/* ... */

Учитывая следующие данные:

$data = [
  "type" => "credentials"
];

Даст мне ошибки:

{
    "username": "This field is missing.",
    "type": "This field was not expected.",
    "password": "This field is missing.",
    "passwordConfirm": "This field is missing."
}

Типа не ожидалось, не должно появиться.Я начал использовать Assert\Collection вместо массива (как в примерах для скалярных значений) для корня, но он также не работал.

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

...