Я пытался создать свой валидатор, но он не работает.Документация не помогает, потому что она заботится только о проверке объекта и имеет один пример для проверки массива.
Я пытаюсь проверить мои данные на основе полей, отправленных с данными.Поэтому в запросе у меня есть поле type
, которое либо credentials
, google
, либо facebook
, и, в зависимости от значения этого поля, другие поля должны быть проверены.Конечно, сначала нужно проверить type
.
Я пытался следовать документации для коллекций, но я получаю только неожиданные исключения и результаты.Иногда ошибки, иногда нет, вещь просто не работает, как ожидалось.
Учитывая следующий пример:
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validation;
require_once(__DIR__ . "/../vendor/autoload.php");
$validator = Validation::createValidator();
$constraints = new Assert\Collection([
"type" => [
new Assert\Required([
"groups" => ["type"],
"constraints" => new Assert\Choice([
"choices" => ["credentials", "facebook", "google"],
])
]),
],
"username" => [
new Assert\NotBlank([
"groups" => ["credentials", "facebook", "google"]
])
],
"password" => [
new Assert\NotBlank([
"groups" => ["credentials"]
]),
new Assert\Length([
"min" => 6,
"groups" => ["credentials"]
]),
],
"passwordConfirm" => [
new Assert\NotBlank([
"groups" => ["credentials"],
]),
new Assert\IdenticalTo([
"groups" => ["credentials"],
"propertyPath" => "password"
])
]
]);
$data = [];
$errors = $validator->validate($data, $constraints, "credentials");
foreach ($errors as $error) {
echo $error->getPropertyPath() . ": " . $error->getMessage() . "<br />";
}
Будет выводить:
[type]: This field is missing.
[username]: This field is missing.
[password]: This field is missing.
[passwordConfirm]: This field is missing.
Даже если яявно передали "credentials"
группам.Я также пытался использовать опцию fields
, но она привносила больше проблем.Кто-нибудь знает, как правильно использовать валидатор и использовать группы для проверки только подмножеств данных.