我希望能够做出类似于Symfony教程中使用数据转换器的方法,但我想添加一个步骤,但找不到任何示例。
在Symfony教程中,数据转换是将问题编号更改为Issue
对象,这是在IssueToNumberTransformer
的reverseTransform()
函数中完成的。
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
。因此,表单会显示错误消息"This value is not valid"。个性化此消息将是很好的。
数据转换过程在任何验证之前执行(包括对字段应用的约束),因此我找不到在尝试转换之前验证问题编号的方法。
另一个需要在转换之前进行验证的例子是,我使用MongoDB文档管理器将"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表单中接收到的ID格式不是正确的MongoID,客户端将会收到500错误。因此,在转换之前,我想要检查接收到的ID是否正确,因为如果它不正确,转换将会引发致命错误。如果我在转换器中处理所有情况,比如检查$id是否正确,那么就好像我在转换器中进行了验证,但这是不正确的。
我的问题是:有没有办法在数据转换之前应用约束?或者在转换失败时,有没有一种方法在表单上添加摘要约束违规?
$form->handleRequest
时,用try/catch块包围它吗? - saamorim