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: SymfonyProfilerBlackFire ProfilerBlackFire Profiler

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?

21
demandé sur Agustin Ugarte 2014-11-06 14:11:57

2 réponses

le comportement décrit ressemble à l'œuvre du devin. J'ai le sentiment qu'il est nécessaire de montrer un code supplémentaire (auditeurs, VariantType,WebsiteType,