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 buildViewVariantType a été PurchasebuildViewtext type de formulaire. Mais après cela, à partir de quelque part buildViewVariantType 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?