Gewusst wie: Optimieren der Leistung von Symfony-Formularen?
Ich habe ein Formular, das der Engpass meiner Ajax-Anfrage ist.
$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,
)
);
Für saubereren Code habe ich @ gelöscstopwatch
Anweisungen.
MyAuftragsar hat folgende Felder:
$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,
));
Art des Kauf:
$builder
->add('amount')
->add('price')
->add('code', 'variant', array(
'property_path' => 'variantEntity',
'data_class' => '\Acme\MyBundle\Entity\Simpla\Variant'
))
;
EbenfallsArt des Kauf hat einen Listener, der hier nicht von Bedeutung ist. Es wird im Symfony-Profiler unten als @ dargestellvariant_retrieve
, purchase_form_creating
. Sie können sehen, dass es ungefähr 200 ms dauert.
Hier stelle ich das Ergebnis der Profiler:
Wie du sehen kannst:$this->createForm(...)
dauert 1011ms,$form->createView();
dauert 2876ms und das Rendern von Formularen im Zweig ist ebenfalls sehr langsam: 4335ms. Wie von Blackfire Profiler angegeben, das ganze Geschäft inObjectHydrator::gatherRowData()
undUnitOfWork::createEntity()
.
MethodecreateEntity()
hat 2223 mal angerufen, weil es ein Feld gibt, das mit @ abgebildet iVariant
entity und hat den FormulartypEntity
. Aber wie Sie aus dem obigen Code sehen können, gibt es keinentity
Typen für Variante. MeinVariantType
ist einfach erweiterttext
Formulartyp mitmodelTransformer
. Um nicht alles durcheinander zu bringen, können Sie Code für eine ähnliche Typklasse unter @ sehe docs.
Ich habe mit XDebug festgestellt, dassbuildView
zumVariantType
wurde in @ aufgerufPurchase
'sbuildView
mittext
Formulartyp. Aber danach von irgendwobuildView
zumVariantType
wurde erneut aufgerufen und hat in diesem Fallentity
Formulartyp. Wie kann das möglich sein? Ich habe versucht, ein leeres Array in @ zu definierchoices
undpreferred_choices
auf jedem meiner Formulartypen, aber es hat sich nichts geändert. Was muss ich tun, um @ zu verhinderEntityChoiceList
für mein Formular geladen werden?