操作方法:优化 Symfony 的表单性能?
我有一个表单,这是我的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,
)
);
为了更干净的代码,我删除了语句。stopwatch
我的订单类型有下一个字段:
$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,
));
购买类型:
$builder
->add('amount')
->add('price')
->add('code', 'variant', array(
'property_path' => 'variantEntity',
'data_class' => '\Acme\MyBundle\Entity\Simpla\Variant'
))
;
此外,购买类型有一个监听器,在这里并不重要。它在下面的 Symfony 分析器中表示为 , 。您可以看到大约需要200ms。variant_retrieve
purchase_form_creating
在这里,我放置了分析器的结果:
如您所见:需要1011ms,需要2876ms,在树枝中的形式渲染也非常慢:4335ms。正如黑火分析器所说,所有交易都在 和 .$this->createForm(...)
$form->createView();
ObjectHydrator::gatherRowData()
UnitOfWork::createEntity()
方法调用 2223 次,因为存在一些与实体映射并具有表单类型的字段。但是,从上面的代码中可以看出,没有变体的类型。我的是具有.为了不搞砸所有内容,您可以在文档中看到类似Type类的代码。createEntity()
Variant
Entity
entity
VariantType
text
modelTransformer
我发现 XDebug 已经调用了 's 与表单类型.但是在那之后,从某个地方再次调用了for,在这种情况下,它具有表单类型。这怎么可能?我试图在我的每个表单类型中和每个表单类型上定义空数组,但它没有改变任何东西。我需要做些什么来防止我的表单被加载?buildView
VariantType
Purchase
buildView
text
buildView
VariantType
entity
choices
preferred_choices
EntityChoiceList