Symfony2 @Assert \有效:遍历Vs深

ziz*_*jab 8 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,
  ))
;
Run Code Online (Sandbox Code Playgroud)

安装xhproof并调查问题后,我发现验证需要花费大量时间.

/**
* @ORM\ManyToOne(targetEntity="Ttm\HardwareBundle\Entity\Manufacturer", inversedBy="models")
* @Assert\Valid() <--- this line is the problem
*/
private $manufacturer;
Run Code Online (Sandbox Code Playgroud)

Symfony2关于有效注释的文档不是很清楚:

traverse

类型:boolean默认:true

如果将此约束应用于包含对象数组的属性,则仅当此选项设置为true时,才会验证该数组中的每个对象.

deep

类型:boolean默认:false

如果将此约束应用于包含对象数组的属性,则如果此选项设置为true,则将以递归方式验证该数组中的每个对象.

资料来源:http://symfony.com/doc/current/reference/constraints/Valid.html

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

bla*_*amb 3

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

如果您将其保留为默认值,则通过使用traverse link,它将覆盖嵌套数组内的所有对象,忽略在此父对象内看到的任何对象数组,即将跳过对它们的验证。它还必须寻找并覆盖任何实例\Traversable

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

否则,如果您看到性能差异,则可能traverse是编程不当,或者必须寻找 Traversable 实例是很困难的。

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