gpt4 book ai didi

php - 如何处理包含 500 多个项目的 Symfony 表单集合

转载 作者:可可西里 更新时间:2023-11-01 13:30:37 26 4
gpt4 key购买 nike

我有一个表单集合,需要处理超过 500 个实体实例。在我将超时时间增加到 60 秒并增加 max_input_vars 表单工作之后,但它的速度很慢,这很烦人。呈现表单很慢,但提交大表单很痛苦。

我正在考虑创建纯 HTML 表单,但还有其他一些缺点,比如验证。那么,有什么合适的方法可以通过 symfony 表单处理大量数据吗?

Controller :

public function ratesCardAction() {
$bannerList = $this->data;

$em = $this->getDoctrine()->getManager();
$form = $this->createForm(new AdvertiserRatesType($bannerList));
if ('POST' == $this->getRequest()->getMethod()) {
$form->handleRequest($this->getRequest());
$advertiserCampaign = $form->getData();
if ($form->isValid()) {
foreach ($advertiserCampaign['campaignsAdZones'] as $campaignAdZone) {
$em->persist($campaignAdZone);
}
$em->flush();
}
}

return array(
'form' => $form->createView()
);
}



class AdvertiserRatesType extends AbstractType {

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder ->add('campaignsAdZones', 'collection', array(
'type' => new AdvertiserRatePerCountryType(),
'data' => $this->rates,
'empty_data' => null,
'options' => array(
'attr' => array('class' => 'campaignAdZoneItem')
)
))
;
}

}

...

嵌入形式看起来像:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('class', 'entity', array(
'class' => 'AcmeCmsBundle:PublisherTypes',
'property' => 'class',
'read_only' => true,
'disabled' => true
)
)
->add('country', 'entity', array(
'class' => 'AcmeCmsBundle:Countries',
'property' => 'name',
)
)
->add('text1')
->add('text2')
;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\CmsBundle\Entity\Rates'
));
}

最佳答案

确实使用整个实体来收集超过 500 个项目是一种矫枉过正 ;)

首先:使用纯数组代替实体,在setDefaultOptions方法中设置'data_class' => null

第二:您不想在一页表单上创建超过 500 个新项目,是吗? ;) 如果出于某种原因确实需要它并且必须那样做...... 那么目前 $advertiserCampaign = $form->getData(); 在你的代码中将返回超过 500 个对象 -重的。相反,$advertiserCampaign = $form->getData(); 应该返回 500 个数据数组,然后在 foreach 中您应该创建新对象并将数据绑定(bind)到它(例如使用 datatransfomer)。验证仍然可以毫无问题地处理 - 只需为表单类中的每个字段设置验证器。

第三:我希望 $this->rates 不是另一个对象集合 - 对吧?如果是 - 使用原始数组而不是重对象。

第四:一页上有 500 个对象/表格?真的吗?它可能会以某种方式重构吗?也许分页,例如每页 20 个表格?如果你真的,真的需要在一个请求中从一个表单中保存 500 个对象,那么我建议使用一些队列处理程序,如 RabbitMQ 或 Gearman,将所有 500 个对象保存在数据库中。

我希望能有所帮助。

关于php - 如何处理包含 500 多个项目的 Symfony 表单集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18718952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com