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:
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()
và 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 choices
và preferred_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?
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. –
Đó 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ó. –
Nếu không có Twig nó cũng gọi 'getEntity' và do đó' createEntity' chính xác 2223 lần. –