2014-11-06 18 views
21

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. SymfonyProfiler BlackFire Profiler Gördüğünüz gibi BlackFire Profiler

: $this->createForm(...) 1011ms alır $form->createView(); çok yavaş da dal içinde 2876ms ve form oluşturma alır: 4335ms

Burada profilleyicilerini sonucunu koydu. Blackfire profiler tarafından belirtildiği gibi 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?

+0

Bildiğim kadarı ile, en azından templasyon ile, dev ortamıyla dal önbelleğe alma olmaması olabilir. –

+0

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. –

+0

Twig olmadan "getEntity" ve "createEntity" de tam olarak 2223 defa. –

cevap

0

Ben de aynı tür problemi vardı, şehirleri listelemeye ihtiyacım vardı, 4000'den sonra mire gibiydi, temelde yaptığım seçimler formun içine enjekte etmektir. Kontrolörünüzde, Varyantlardan bir havuz çağrısında, bir havuz çağrısında diziyi dizi olarak hiddetlendirirsiniz ve siz sadece kimliği ve ismi ya da başlığı seçersiniz ve daha sonra forma geçersiniz, seçenekler olarak. Bununla birlikte veritabanı kısmı çok daha hızlı olacaktır.

+0

Hiçbir şey almanıza gerek yok. Siparişim var, siparişin bir satın alma işlemi var, bu satın almada bir ürün var, bu ürünün bir varyantı var. Herhangi bir kuruluşun seçim listelerine ihtiyacım yok. –

+0

Bu çağrı sırasında kaç sorgu çalıştı? – ghostika

+0

Sorgularla ilgili değil. DB için 9 sorgu. Sorumu daha açık olmak için güncelledim. –

2

Tanımlanan davranış, tahmincinin çalışması gibi görünüyor. Bazı ek kodlar göstermeye ihtiyaç duyduğunu hissediyorum (dinleyiciler, VariantType, WebsiteType, PartnerType). (Ben türü belirtilmemişse yerlerde bir sürü görmek gibi)

Farz edelim bir bazı sınıf bu sınıf için Variant ve FormType ilişkilendirmeyi variant sahip açık belirtim türü olmadan kod ->add('variant') sahiptir. Sonra DoctrineOrmTypeGuesser oyuna geliyor.

https://github.com/symfony/symfony/blob/2.7/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php#L46

Bu kod, bu çocuğa entity türü (!) Atayın. EntityRepository::findAll() çağrılır ve DB'nin tüm varyantları hidratlanır. Başka bir şekilde optimizasyon yolları gelince

: tahmin tipini önlemek için mümkün olan tüm vakalarda türünü belirtmek için

  • deneyin;
  • Her form haritaları ilişkisi için temel veriyi ayarlamak için DB'ye gönderilen alt alt isteklerin gönderildiği sırada bir sipariş almak için SELECT'i JOIN'lerle birlikte kullanın;
  • Tek bir öğenin anahtarsız bir şekilde kaldırılması gereksiz güncelleştirmeleri tetikleyeceğinden, bir gönderimdeki toplama öğeleri için anahtarları koru.
+0

Kodumdan da görebileceğiniz gibi, varyant form için daha önce belirtmiş olduğum bir tür var. Dönüştürücü dinleyiciyle 'metin 'türüne sahiptir. Web sitesi ve İş Ortağı kurumlarının genel giderleri yoktur. –

+0

Oluşturulan html nasıl görünüyor? 'Entity' kodu (radyo butonları, onay kutuları veya seçim kutusu) hangi yerde görünür? – origaminal

+0

Varyant seçim türü için standart metin girişi yerine gizli giriş oluşturmak için varsayılan temayı geçersiz kılıyorum. Webiste ve Ortaklar için geçersiz form temasıyla kendi seçim listesini oluşturuyorum. –

İlgili konular