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?