我有一个需要很长时间的简单表格:
$builder->add('manufacturer', 'entity', array(
'class' => 'XBundle\Entity\Manufacturer',
....
))
->add('type','entity', array(
'class' => 'XBundle\Entity\Entity\Type',
))
->add('size','entity', array(
'class' => 'XBundle\Entity\Size',
))
->add('serial', 'text', array(
'required'=>true,
))
;
安装xhproof
并调查问题后,我发现验证需要花费大量时间。
/**
* @ORM\ManyToOne(targetEntity="Ttm\HardwareBundle\Entity\Manufacturer", inversedBy="models")
* @Assert\Valid() <--- this line is the problem
*/
private $manufacturer;
Symfony2关于有效注释的文档不是很清楚:
traverse
输入:
boolean
默认值:true
如果此约束应用于包含数组的属性 对象,那么只有这样才能验证该数组中的每个对象 选项设置为true。
deep
输入:
boolean
默认值:false
如果此约束应用于包含数组的属性 对象,然后递归验证该数组中的每个对象 如果此选项设置为true。
来源:http://symfony.com/doc/current/reference/constraints/Valid.html
我的问题是,这两个选项之间有什么区别,哪些值可以保证我的表现更好?
答案 0 :(得分:3)
http://api.symfony.com/2.4/Symfony/Component/Validator/ExecutionContextInterface.html
如果你保留默认值,使用traverse
link,它将覆盖嵌套数组中的所有对象,忽略它在此父对象中看到的任何对象数组,即将跳过验证他们。它还必须查找并覆盖\Traversable
使用deep
link验证这些对象以查找嵌套集合。它甚至可能会跳过那些不符合标准的验证,例如过滤器,所以要小心。
否则,如果你看到性能上的差异,traverse
可能编程不好或者不得不寻找Traversable的实例是很难的。
如果您不需要遍历,对于您的情况,您可能会考虑仅使用deep
,因为它更快,但请确保您的结果没有剪裁。