Comment: optimiser les performances de Symfony forms?
j'ai un formulaire qui est le goulot d'étranglement de mon ajax demande.
$order = $this->getDoctrine()
->getRepository('AcmeMyBundle:Order')
->find($id);
$order = $order ? $order : new Order();
$form = $this->createForm(new OrderType(), $order);
$formView = $form->createView();
return $this->render(
'AcmeMyBundle:Ajax:order_edit.html.twig',
array(
'form' => $formView,
)
);
Pour plus d'nettoyeur de code que j'ai supprimé stopwatch
consolidés.
Mon OrderType a champs suivants:
$builder
->add('status') // enum (string)
->add('paid_status') // enum (string)
->add('purchases_price') // int
->add('discount_price') // int
->add('delivery_price') // int
->add('delivery_real_price', null, array('required' => false)) // int
->add('buyer_name') // string
->add('buyer_phone') // string
->add('buyer_email') // string
->add('buyer_address') // string
->add('comment') // string
->add('manager_comment') // string
->add('delivery_type') // enum (string)
->add('delivery_track_id') // string
->add('payment_method') // enum (string)
->add('payment_id') // string
->add('reward') // int
->add('reward_status') // enum (string)
->add('container') // string
->add('partner') // Entity: User
->add('website', 'website') // Entity: Website
->add('products', 'collection', array( // Entity: Purchase
'type' => 'purchase',
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'property_path' => 'purchases',
'error_bubbling' => false,
));
Type D'achat:
$builder
->add('amount')
->add('price')
->add('code', 'variant', array(
'property_path' => 'variantEntity',
'data_class' => 'AcmeMyBundleEntitySimplaVariant'
))
;
Type D'achat a un auditeur qui n'est pas important ici. Il est représenté dans le profileur Symfony ci-dessous comme variant_retrieve
,purchase_form_creating
. Vous pouvez voir que cela prend environ 200ms.
voici le résultat des profileurs:
Comme vous pouvez le voir: $this->createForm(...)
prend 1011ms,$form->createView();
prend 2876ms et le rendu de forme en brindille est aussi très lent: 4335ms. Comme indiqué par le profileur blackfire toute l'affaire dans ObjectHydrator::gatherRowData()
et UnitOfWork::createEntity()
.
Méthode createEntity()
appelé 2223 fois parce qu'il y a un champ qui correspond à Variant
entité et qui a une forme de type Entity
. Mais comme vous pouvez le voir d'en haut code il n'y a pas de entity
types pour la variante. Mon VariantType
est simple extended text
type de formulaire qui a modelTransformer
. Pour ne pas tout gâcher, vous pouvez voir le code pour une classe de Type similaire à docs.
j'ai trouvé avec XDebug que buildView
VariantType
a été Purchase
buildView
text
type de formulaire. Mais après cela, à partir de quelque part buildView
VariantType
a été appelé de nouveau et dans ce cas, il a entity
type de formulaire. Comment peut-il être possible? J'ai essayé de définir le tableau vide dans choices
et preferred_choices
sur chaque type de mon formulaire, mais ça n'a rien changé. Ce que je dois faire pour empêcher EntityChoiceList
à charger pour mon formulaire?