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

Mil*_*los 6 php forms bulkinsert bulk symfony

我有表单集合,需要处理超过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')
            )
        ))
        ;
    }

}
Run Code Online (Sandbox Code Playgroud)

...

和嵌入的表单看起来像:

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'
    ));
}
Run Code Online (Sandbox Code Playgroud)

小智 2

事实上,使用整个实体来收集超过 500 个项目是一种矫枉过正的行为;)

第一:使用纯数组代替实体,'data_class' => nullsetDefaultOptions方法中设置

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

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

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

我希望这能有所帮助。