Я пишу API, который примет строку JSON, проанализирует ее и вернет запрошенные данные. Для этого я использую компонент проверки Symfony, но у меня возникают некоторые проблемы при проверке массивов.
Например, если у меня есть эти данные:
{
"format": {
"type": "foo"
}
}
Тогда я могу легко проверить это с помощью такого кода PHP:
$constraint = new Assert\Collection(array(
"fields" => array(
"format" => new Assert\Collection(array(
"fields" => array(
"type" => new Assert\Choice(["foo", "bar"])
)
))
)
));
$violations = $validator->validate($data, $constraint);
foreach ($violations as $v) {
echo $v->getMessage();
}
Если type
не равно ни foo
, ни bar
, я получаю нарушение. Даже если type
- что-то экзотическое, например объект DateTime
, я все равно получаю нарушение. Легкий!
Но если я установлю свои данные так:
{
"format": "uh oh"
}
Затем вместо сообщения о нарушении (поскольку Assert\Collection
ожидает массив) я получаю неприятное сообщение PHP:
Fatal error: Uncaught Symfony\Component\Validator\Exception\UnexpectedTypeException: Expected argument of type "array or Traversable and ArrayAccess", "string" given [..]
Если есть изящный способ справиться с такими вещами, без необходимости пытаться / ловить и обрабатывать ошибку вручную и без необходимости удваивать проверку (например, одна проверка, чтобы проверить, является ли format
массивом, затем другая проверка, чтобы проверить, type
является действительным)?
Гист с полным кодом находится здесь: https://gist.github.com/Grayda/fec0ed7487641645304dee668/ >
Я использую Symfony 4