Symfony2 @Assert\Valid: 遍历 Vs 深度

8

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

$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
似乎 traverse 只验证第一层,而 deep 则扫描数组的第一层和子层级。 - A.L
2
我也曾这样想过,但是 traverse=falsedeep=true 似乎在性能上更好。 - zizoujab
1个回答

3

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

如果您使用默认设置,通过使用 traverse 链接,它将覆盖嵌套数组中的所有对象,忽略在此父对象内看到的任何对象数组,即跳过对它们的验证。 它还必须查找并覆盖任何实例为\Traversable的内容。

使用deep 链接验证这些对象,寻找嵌套集合。 它甚至可能会跳过不符合该标准的对象,就像一种过滤器,因此请小心使用。

否则,如果您发现性能有差异,则可能是traverse编程不良或需要查找Traversable实例很困难。

如果您不需要遍历,则可以考虑仅使用deep,因为它更快,但请确保结果没有被裁剪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接