我有表单集合,需要处理超过500个实体实例。在我将超时增加到60秒并且增加了max_input_vars形式工作之后,但是它的速度有多慢。渲染形式很慢,但提交这个大形式是痛苦的屁股。
我正在考虑创建简单的HTML表单,但还有其他一些缺点就是验证。 那么,有没有通过symfony形式处理大量数据的正确方法?
控制器:
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'
));
}
答案 0 :(得分:1)
确实使用整个实体收集超过500件物品是一种过度杀伤力;)
首先:使用纯数组而不是实体,在'data_class' => null
方法
setDefaultOptions
第二:您不希望在一个页面表单上创建超过500个新项目,是吗? ;)如果由于某种原因确实需要它并且必须这样做...当前$advertiserCampaign = $form->getData();
在您的代码中将返回超过500个对象 - 重。而不是那样,$advertiserCampaign = $form->getData();
应该返回500个数据数组,然后在foreach中返回THEN你应该创建新对象并将数据绑定到它(例如使用datatransfomer)。
验证仍然可以毫无问题地处理 - 只需为表单类中的每个字段设置验证器。
第三:我希望$this->rates
不是另一个对象集合 - 对吧?如果是 - 使用原始数组而不是重物。
第四:一页上有500个对象/表格?真?可能会以某种方式重构吗?也许是分页,例如每页20个表格? 如果你确实需要在一个请求中保存来自一个表单的500个对象,那么我建议使用像RabbitMQ或Gearman这样的Queue处理程序来保存数据库中的所有500个对象。
我希望能以某种方式提供帮助。
答案 1 :(得分:0)
我可以建议使用Doctrine查询缓存吗?通常情况下,缓存是一种常见的解决方案。
查看其他Symfony缓存,并且不要犹豫,测试尽可能多的PHP缓存解决方案(参见最后一个链接)。