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
我的问题是,这两个选项有什么区别,哪些值可以保证我的表现更好?
http://api.symfony.com/2.4/Symfony/Component/Validator/ExecutionContextInterface.html
如果您将其保留为默认值,则通过使用traverse
link,它将覆盖嵌套数组内的所有对象,忽略在此父对象内看到的任何对象数组,即将跳过对它们的验证。它还必须寻找并覆盖任何实例\Traversable
使用deep
链接验证这些对象以查找嵌套集合。它甚至可能会跳过对那些不符合该标准的验证,例如过滤器,因此请小心。
否则,如果您看到性能差异,则可能traverse
是编程不当,或者必须寻找 Traversable 实例是很困难的。
如果您不需要可遍历,对于您的情况,您可能会考虑使用它,deep
因为它速度更快,但请确保您的结果不会被剪裁。