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

2024-01-24

我有需要处理 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'
    ));
}

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

第一:使用纯数组代替实体,设置'data_class' => null in setDefaultOptions method

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

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

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

我希望这能有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Yii 高级 url 重写

    注意 ANYTHING ELSE 因此 我有我的控制器和操作 我希望它们能够正常运行 以响应如下示例 for UserContoller with actionList and actionEdit user list user edit
  • 使用 ModelAndView 进行 Spring MVC 验证

    我正在尝试向我的 Spring MVC 应用程序添加验证 在尝试设置验证之前 我一直使用 ModelAndView 来提供 jsp 页面 但错误消息不显示 Model Entity Table name employee public cl
  • 3 个 div 并排 - 中心一个固定宽度,其他 div 占据屏幕空间的其余部分

    我一整天都在尝试为我的网站创建一个 容器 我需要并排放置 3 个 div 中心 div 具有固定宽度 800px 并且位于屏幕中央 其他 div 必须占据左右两侧的所有剩余空间 左边的 div 将位于顶部的某个位置 右边的 div 将位于底
  • 如何从 JTextPane 中获取选择

    我想找出 JTextPane 文本的哪一部分被选中 尝试打电话JTextPane getSelectionStart and JTextPane getSelectionEnd 但它们总是返回等于当前插入符号位置的相同值 我的问题是什么 我
  • 使用网格几何形状和屏幕尺寸根据窗口尺寸调整小部件尺寸

    我想使用网格几何形状根据窗口的大小更改小部件的大小 最大化或最小化 例子 如果创建了一个窗口 并且它的外观在最小化模式下实现 但在扩展时它会显示一些空白空间 我想以这种方式扩展小部件来填充该空白空间 如果改变 LCD 窗口看起来应该是一样的
  • 第一次开发Android应用程序时如何修复java中的“R.menu.main”?

    所以我下载了 Android 应用程序教程告诉我的所有内容 并且我正在使用 Eclipse 但我不断收到错误消息main in R menu main public boolean onCreateOptionsMenu Menu menu
  • Python 套接字超时错误

    我正在 Python 2 7 中编写一个非常简单的 udp 套接字连接 服务器端已启动并运行 我在客户端遇到麻烦 from socket import serverName 127 0 0 1 serverPort 5444 counter
  • 使用 PyDub 消除波形文件开头和结尾处的静音

    如何使用 PyDub 消除波形文件开头和结尾的静音 我想我应该逐段访问并检查它是否静音 但我无法做到 例如我有一个在开头 结尾或两者都有静音的波形文件 如下所示 我想删除文件开头和结尾的静音 例如我想导入它 sound AudioSegme
  • Crystal Report 组汇总总和

    我有一份报告 其中我试图将一组的摘要汇总到另一组 前任 group 1 75 lt sum of the maximums group 2 50 lt max of the group line 1 50 line 2 40 line 3
  • Rails 范围和连接

    我已经尝试了所有我认为可行的方法 但一无所获 在 Rails 3 中 我需要找到车上有 CD 播放器的所有用户 一辆车有一个用户和一台收音机 一个用户属于一辆车 一台收音机有很多辆车 我偶然发现如何通过用户模型中的范围执行此搜索 class
  • 在 SQL Server 中使用标识列为 INSERT 语句指定“NEXT VALUE”

    考虑下表和 SQL微软的INSERT文档 https technet microsoft com en us library dd776381 v sql 105 aspx ColumnValues处理 IDENTITY 列 CREATE
  • Terraform - 将策略附加到 s3 存储桶

    我之前创建了一篇文章来解决创建多个 s3 存储桶而不尝试重复代码的问题 效果很好 Terraform 创建多个存储桶 https stackoverflow com questions 53764505 terraform creating
  • Outlook 中的 VBA 搜索

    我有这个代码可以在我的文件夹中搜索 我确实有一封主题为 sketch 的电子邮件 但 VBA 没有找到它 它转到 ELSE 子句 谁能告诉我出了什么问题吗 Set olApp GetObject Outlook Application Se
  • 直接将单个 XML 文件转换为 DOCX

    我尝试将单个 XML 文件转换为 DOCX 文件 方法是使用 XSLT 将 XML 转换为 XHTML 然后在 MS Word 上打开 XHTML 并将其另存为 DOCX 但我的任务是将任何 XML 结构 DITA TEI DocBook
  • 在 Raspberry Pi 上使用带有 PyAudio 的麦克风时出现 IOError:[Errno 通道数无效] -9998

    各位 坏消息来了 我尝试通过 PyAudio 在 Raspberry Pi 上使用麦克风 但没有成功 麦克风连接到 USB 声卡 当我通过 arecord 时麦克风工作 pi raspberrypi arecord D plughw 0 0
  • TortoiseGit:如何暂时切换到早期版本

    在 Git 中 我对主分支进行了一系列更改 并且还创建了一个名为 BeforeDynamicCasts 的标签 我希望暂时切换到 BeforeDynamicCasts 然后恢复到我的主分支 我该怎么做 我可以切换 签出标签 但不确定之后如何
  • 在 ASP.NET MVC 3 中以编程方式更改 Web Config 中的自定义错误模式

    如何以编程方式更改 web config 文件中的自定义错误模式 我需要更改以下内容
  • 实现滚动导航抽屉的最佳方法

    我一直在向我的一个应用程序添加导航抽屉 我开始想知道从使用导航抽屉切换是否会更好ListView到多个TextViews 表示抽屉式导航列表项 看着关于导航抽屉内容的 Google 设计指南 特别是 滚动 部分 http www googl
  • 如何在 HAProxy 1.6.4 中与前端相同的端口上运行统计信息?

    我正在使用 HAProxy 1 6 4 并且想要启用统计信息 haproxy 统计 这是我的cfg global log 127 0 0 1 local2 daemon maxconn 256 defaults log global tim
  • 如何处理包含 500 多个项目的 Symfony 表单集合

    我有需要处理 500 多个实体实例的表单集合 在我将超时增加到 60 秒并增加 max input vars 表单工作后 但令人烦恼的是它的速度有多慢 渲染表单很慢 但提交这么大的表单却很痛苦 我正在考虑创建纯 HTML 表单 但还有一些其