Symfony2 @Assert\Действительный: пересечение Vs deep

У меня простая форма, которая занимает очень много времени:

$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

type: boolean default: true

Если это ограничение применяется к свойству, которое содержит массив объектов, то каждый объект в этом массиве будет проверяться только в том случае, если это для параметра установлено значение true.

deep

type: boolean default: false

Если это ограничение применяется к свойству, которое содержит массив объектов, то каждый объект в этом массиве будет рекурсивно проверен если для этой опции установлено значение true.

Источник: http://symfony.com/doc/current/reference/constraints/Valid.html

Мой вопрос: какая разница между двумя параметрами и какие значения гарантируют мне лучшую производительность?

1 ответ

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

если вы оставите его по умолчанию, используя traverse ссылку, он будет охватывать все объекты внутри вложенного массива, игнорируя любые массивы объектов что он видит внутри этого родительского объекта, то есть пропустит проверку на них. Он также должен искать и покрывать все, что является экземпляром \Traversable

используя deep ссылка, проверяет эти объекты на поиск вложенной коллекции. Это может даже пропустить проверку на те, которые не соответствуют этим критериям, например вид фильтра, поэтому будьте осторожны с этим.

В противном случае, если вы видите разницу в производительности, либо traverse может быть плохо запрограммирован или вам нужно искать экземпляры Traversable, это сложно.

Если вы не нуждаетесь в прохождении, для вашего случая вы можете использовать только deep, так как он быстрее, но убедитесь, что ваши результаты не подрезаны.

licensed under cc by-sa 3.0 with attribution.