Symfony2 @Assert \有效:遍历Vs深

时间:2015-04-21 14:53:56

标签: php validation symfony

我有一个需要很长时间的简单表格:

$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

我的问题是,这两个选项之间有什么区别,哪些值可以保证我的表现更好?

1 个答案:

答案 0 :(得分:3)

http://api.symfony.com/2.4/Symfony/Component/Validator/ExecutionContextInterface.html

如果你保留默认值,使用traverse link,它将覆盖嵌套数组中的所有对象,忽略它在此父对象中看到的任何对象数组,即将跳过验证他们。它还必须查找并覆盖\Traversable

的任何实例

使用deep link验证这些对象以查找嵌套集合。它甚至可能会跳过那些不符合标准的验证,例如过滤器,所以要小心。

否则,如果你看到性能上的差异,traverse可能编程不好或者不得不寻找Traversable的实例是很难的。

如果您不需要遍历,对于您的情况,您可能会考虑仅使用deep,因为它更快,但请确保您的结果没有剪裁。