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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage