Объединить ограничения и преобразователи данных
Я хотел бы сделать что-то похожее на то, что делается вКак использовать Data Transformers руководство. Но я хотел бы добавить процесс, и я не могу найти ни одного примера.
В учебнике по Symfony преобразование данных касается изменения номера проблемы наIssue
объект. Это сделано вreverseTransform()
функцияIssueToNumberTransformer
public function reverseTransform($number)
{
if (!$number) {
return null;
}
$issue = $this->om
->getRepository('AcmeTaskBundle:Issue')
->findOneBy(array('number' => $number))
;
if (null === $issue) {
throw new TransformationFailedException(sprintf(
'An issue with number "%s" does not exist!',
$number
));
}
return $issue;
}
Мы можем видеть, что если указан неверный номер проблемы, преобразование завершится неудачно, и функция сгенерируетTransformationFailedException
, В результате в форме появляется ошибка с сообщением «Это значение недопустимо». Было бы здорово персонализировать это сообщение.
Процесс преобразования данных выполняется перед любой проверкой (с ограничениями, примененными к полю), поэтому я не могу найти способ проверить номер проблемы, прежде чем пытаться преобразовать ее.
Еще один пример того, почему мне нужно проверить перед преобразованием, я использую MongoDB Document Manager для преобразования «Issue mongo id» в Issue (форма используется сервером REST API, поэтому я получаю id). Так :
public function reverseTransform($id)
{
if (!$number) {
return null;
}
$issue = $this->dm
->getRepository('AcmeTaskBundle:Issue')
->find(new \MongoId($id))
;
if (null === $issue) {
throw new TransformationFailedException(sprintf(
'An issue with number "%s" does not exist!',
$number
));
}
return $issue;
}
Здесь, если идентификатор, который я получаю в форме API, не отформатирован как правильный MongoID, клиент получит 500. Поэтому я хочу перед преобразованием проверить, верен ли полученный идентификатор, потому что, если это не так, преобразование вызовет фатальную ошибку. И если я управляю всеми делами в моем преобразовании, такими как проверка правильности $ id, это похоже на то, что я делаю проверку в преобразователе, и это не правильно.
Мой вопрос: есть ли способ применить ограничения перед преобразованием данных? или есть способ добавить дайджест constraintViolation на форму, когда преобразование не удалось?