2014-11-06 23 views
21

Tôi có một biểu mẫu là nút cổ chai của yêu cầu ajax của tôi.Cách thực hiện: Tối ưu hóa hiệu suất biểu mẫu của Symfony?

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

Để có mã sạch hơn, tôi đã xóa stopwatch câu lệnh.

My OrderType có các lĩnh vực sau:

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

mua hàng loại:

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

Cũng mua hàng loại có một người biết lắng nghe đó không phải là quan trọng ở đây. Nó được đại diện trong hồ sơ Symfony dưới đây là variant_retrieve, purchase_form_creating. Bạn có thể thấy rằng nó mất khoảng 200ms.

Ở đây tôi đưa kết quả của profilers: SymfonyProfiler BlackFire Profiler BlackFire Profiler

Như bạn có thể thấy: $this->createForm(...) mất 1011ms, $form->createView(); mất 2876ms và hình thức đang hiển thị trong cành lá cũng rất chậm: 4335ms. Như đã nêu bởi hồ sơ blackfire tất cả các thỏa thuận trong ObjectHydrator::gatherRowData()UnitOfWork::createEntity().

Phương thức createEntity() được gọi là 2223 lần vì có một số trường được ánh xạ với thực thể Variant và có loại biểu mẫu Entity. Nhưng như bạn có thể thấy từ mã trên, không có loại entity cho biến thể. My VariantType được mở rộng đơn giản text loại biểu mẫu có modelTransformer. Để không làm hỏng tất cả mọi thứ bạn có thể thấy mã cho lớp Loại tương tự tại docs.

Tôi đã tìm thấy với XDebug rằng buildView cho VariantType đã được gọi trong Purchase 's buildView với text loại biểu mẫu. Nhưng sau đó từ một nơi nào đó buildView cho VariantType được gọi lại và trong trường hợp này nó có entity loại biểu mẫu. Làm sao chuyện đó có thể xảy ra? Tôi đã cố gắng xác định mảng trống trong choicespreferred_choices trên mọi loại biểu mẫu của tôi nhưng nó không thay đổi bất kỳ thứ gì. Những gì tôi cần làm để ngăn chặn EntityChoiceList được tải cho biểu mẫu của tôi?

+0

Theo như tôi biết, ít nhất là với khuôn mẫu, có thể là do thiếu bộ nhớ đệm ghép đôi với môi trường dev. –

+0

Đó là một ý tưởng tốt để cấu hình kịch bản mà không có cành và đếm bao nhiêu lần 'createEntity()' được gọi trong trường hợp này. Tôi sẽ kiểm tra nó. –

+0

Nếu không có Twig nó cũng gọi 'getEntity' và do đó' createEntity' chính xác 2223 lần. –

Trả lời

0

Tôi cũng gặp vấn đề tương tự với loại thực thể, tôi cần liệt kê các thành phố, giống như mire 4000, những gì tôi đã làm cơ bản là đưa các lựa chọn vào biểu mẫu. Trong bộ điều khiển của bạn, bạn yêu cầu các biến thể từ cơ sở dữ liệu, trong một cuộc gọi kho, hydrate chúng như là mảng, và bạn chỉ chọn id và tên, hoặc tiêu đề, và sau đó bạn chuyển vào biểu mẫu, làm giá trị tùy chọn. Với phần cơ sở dữ liệu này sẽ nhanh hơn nhiều.

+0

Tôi không cần tìm nạp bất kỳ thứ gì. Tôi có một đơn đặt hàng, đơn đặt hàng có một giao dịch mua, giao dịch mua đó có một sản phẩm, sản phẩm đó có một biến thể. Tôi không cần danh sách lựa chọn của bất kỳ thực thể nào. –

+0

Có bao nhiêu truy vấn đã chạy trong cuộc gọi này? – ghostika

+0

Nó không phải là về các truy vấn. 9 truy vấn tới DB. Tôi vừa cập nhật câu hỏi của mình để rõ ràng hơn. –

2

Hành vi được mô tả trông giống như công việc của người đoán. Tôi có cảm giác rằng cần phải hiển thị thêm một số mã (người nghe, VariantType, WebsiteType, PartnerType).

Giả sử một số lớp có hiệp hội variant-VariantFormType cho lớp này có mã ->add('variant') không có loại nêu rõ rõ ràng (như tôi thấy có rất nhiều nơi cất loại không được xác định). Sau đó, DoctrineOrmTypeGuesser có trong trò chơi.

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

Mã này giao entity loại (!) Cho con này. Các EntityRepository::findAll() được gọi là và tất cả các biến thể từ DB được ngậm nước.

Đối với một cách thức tối ưu hóa:

  • Hãy thử để xác định loại trong mọi trường hợp có thể để ngăn chặn một loại đoán;
  • Sử dụng SELECT với JOIN để nhận đơn đặt hàng khi yêu cầu phụ mới đến DB được gửi để đặt dữ liệu cơ bản cho mỗi mối quan hệ bản đồ biểu mẫu;
  • Bảo tồn các khóa cho các yếu tố thu thập khi gửi khi xóa một phần tử đơn lẻ mà không giữ phím sẽ kích hoạt cập nhật không cần thiết.
+0

Như bạn thấy từ mã của tôi, tôi đã chỉ định loại cho dạng biến thể. Nó có kiểu 'text' với bộ biến đổi. Các đối tượng Trang web và Đối tác không có phí. –

+0

Cách tạo html trông như thế nào? Code 'entity' (radiobuttons, checkboxes hoặc selectbox) xuất hiện ở đâu? – origaminal

+0

Tôi ghi đè chủ đề mặc định để tạo đầu vào bị ẩn thay vì nhập văn bản chuẩn cho loại lựa chọn biến thể. Đối với Webiste và Đối tác, tôi tạo danh sách lựa chọn riêng với chủ đề biểu mẫu được ghi đè. –

Các vấn đề liên quan