Я попытался проверить входной массив.Массив должен быть проверен на основе различных условий, есть ограничение 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
вместо массива (как в примерах для скалярных значений) для корня, но он также не работал.
Я искал полную документацию, но не смог найти решение или более подробное объяснениео том, как использовать группы.