Ajax isteğimin darboğazı olan bir form var. daha temiz bir kodu içinNasıl Yapılır: Symfony'nin formlarının performansını en iyi duruma getirin?
$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,
)
);
Ben stopwatch
ifadeleri silindi.
$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,
));
Satın alma türü:
Benim OrderType sonraki alana sahiptir
$builder
->add('amount')
->add('price')
->add('code', 'variant', array(
'property_path' => 'variantEntity',
'data_class' => '\Acme\MyBundle\Entity\Simpla\Variant'
))
;
Ayrıca Satın alma türü burada önemli olmayan bir dinleyicisi vardır. Aşağıdaki Symfony profilerinde variant_retrieve
, purchase_form_creating
olarak temsil edilir. Yaklaşık 200ms aldığını görebilirsiniz. Gördüğünüz gibi
: $this->createForm(...)
1011ms alır $form->createView();
çok yavaş da dal içinde 2876ms ve form oluşturma alır: 4335ms
ObjectHydrator::gatherRowData()
ve
UnitOfWork::createEntity()
tüm anlaşma.
Variant
varlık ile eşlenen ve
Entity
form türüne sahip bir alan olduğu için 2223 kez yöntem
createEntity()
olarak adlandırılır. Ancak yukarıdaki koddan görebileceğiniz gibi, varyant için
entity
tipi yoktur. Benim
VariantType
,
modelTransformer
sahip basit bir şekilde genişletilmiş
text
form türüdür. Her şeyi bozmamak için
docs'da benzer Tip sınıfı için kod görebilirsiniz.
Ben
VariantType
için
buildView
Purchase
'ın
buildView
text
formu türüyle de anılmış xdebug ile buldular. Fakat bundan sonra için
buildView
tekrar çağrıldı ve bu durumda
entity
form tipi var. Bu nasıl mümkün olabilir? Boş formumu
choices
ve
preferred_choices
her form türünde tanımlamaya çalıştım ancak hiçbir şey değişmedi. Formum için
EntityChoiceList
yüklenmesini önlemek için ne yapmam gerekiyor?
Bildiğim kadarı ile, en azından templasyon ile, dev ortamıyla dal önbelleğe alma olmaması olabilir. –
Metni, dalsız olarak profillemek ve bu durumda çağrılan kaç tane createEntity() sözcüğünü saymak iyi bir fikirdir. Bunu kontrol edeceğim. –
Twig olmadan "getEntity" ve "createEntity" de tam olarak 2223 defa. –