Como: Otimizar o desempenho dos formulários do Symfony?

Eu tenho um formulário que é o gargalo do meu pedido de ajax.

    $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,
        )
    );

Para um código mais limpo, apagueistopwatch afirmações.

MinhasOrderType tem próximos campos:

    $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,
        ));

Tipo de compra:

    $builder
        ->add('amount')
        ->add('price')
        ->add('code', 'variant', array(
            'property_path' => 'variantEntity',
            'data_class' => '\Acme\MyBundle\Entity\Simpla\Variant'
        ))
    ;

Além dissoTipo de compra tem um ouvinte que não é significativo aqui. Ele é representado no Symfony Profiler abaixo comovariant_retrieve, purchase_form_creating. Você pode ver que leva cerca de 200ms.

Aqui eu coloquei o resultado dos criadores de perfil:

Como você pode ver:$this->createForm(...) leva 1011ms,$form->createView(); leva 2876ms e a renderização de formulários em galho também é muito lenta: 4335ms. Conforme declarado pelo blackfire profiler, todo o acordoObjectHydrator::gatherRowData() eUnitOfWork::createEntity().

MétodocreateEntity() chamado 2223 vezes porque existe algum campo mapeado comVariant entidade e tem tipo de formulárioEntity. Mas como você pode ver no código acima, não háentity tipos para variante. MinhasVariantType é simples estendidotext tipo de formulário que possuimodelTransformer. Para não estragar tudo, você pode ver o código da classe Type semelhante emdocs.

Eu descobri com o XDebug quebuildView paraVariantType foi chamadoPurchaseébuildView comtext tipo de formulário. Mas depois disso de algum lugarbuildView paraVariantType foi chamado novamente e, neste caso, tementity tipo de formulário. Como isso pode ser possível? Eu tentei definir matriz vazia emchoices epreferred_choices em todos os meus tipos de formulário, mas não mudou nada. O que preciso fazer para evitarEntityChoiceList ser carregado para o meu formulário?

questionAnswers(2)

yourAnswerToTheQuestion