表单:避免将非提交字段设置为 null

2024-04-15

我有一个简单的模型(源简化):

class Collection
{
    public $page;
    public $limit;
}

以及表单类型:

class CollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('page', 'integer');
        $builder->add('limit', 'integer');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'FSC\Common\Rest\Form\Model\Collection',
        ));
    }
}

我的控制器:

public function getUsersAction(Request $request)
{
    $collection = new Collection();
    $collection->page = 1;
    $collection->limit = 10;

    $form = $this->createForm(new CollectionType(), $collection)
    $form->bind($request);

    print_r($collection);exit;
}

When i POST /users/?form[page]=2&form[limit]=20,响应是我所期望的:

Collection Object
(
    [page:public] => 2
    [limit:public] => 20
)

现在,当我POST /users/?form[page]=3,响应为:

Collection Object
(
    [page:public] => 3
    [limit:public] =>
)

limit变为 null,因为未提交。

我想得到

Collection Object
(
    [page:public] => 3
    [limit:public] => 10 // The default value, set before the bind
)

Question:我如何更改表单行为,以便它忽略未提交的值?


如果只是参数(GET参数)的问题,您可以在路由文件中定义默认值

route_name:
pattern: /users/?form[page]={page}&form[limit]={limit}
defaults: { _controller: CompanyNameBundleName:ControllerName:ActionName, 
                         limit:10 }

另一种方法可能是使用hook (i.e. PRE_BIND https://github.com/symfony/Form/blob/master/FormEvents.php)并手动将该值更新到此事件中。这样你就没有将“逻辑”传播到多段代码中。

最终代码 - 由 Adrien 建议 - 将是

<?php

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvents;

class IgnoreNonSubmittedFieldSubscriber implements EventSubscriberInterface
{
    private $factory;

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_BIND => 'preBind');
    }

    public function preBind(FormEvent $event)
    {
        $submittedData = $event->getData();
        $form = $event->getForm();

        // We remove every child that has no data to bind, to avoid "overriding" the form default data
        foreach ($form->all() as $name => $child) {
            if (!isset($submittedData[$name])) {
                $form->remove($name);
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表单:避免将非提交字段设置为 null 的相关文章

  • Symfony2 路由全局 {_locale} 要求

    我在routing yml 中指定了每个路由中的参数 locale 要求 我认为这一定可以简化这种情况 路由 yml ProjectBaseBundle index pattern locale defaults controller Pr
  • Symfony2 和 Doctrine:如何获取同一个 id 的两个不同对象?

    我有这样的场景 对象 A 对其他对象 B C D 有一些引用 对象 B 对其他对象 A F G 有一些引用 对象 C 对其他对象 A 有一些引用 等等 在我的代码中 出于临时原因 我需要制作一个对象 比如A 的 副本 不 我不能使用不同的结
  • Symfony2.1映射错误:class_parents()

    我在 Symfony2 1 项目中尝试使用 Doctrine2 从表 通过实体 获取数据时遇到问题 这是我收到错误的控制器 Country list public function countrylistAction em this gt
  • Symfony2 __toString() 错误

    我在将实体保存回给我时遇到此错误 Catchable Fatal Error Method My BusinessBundle Entity Type toString must return a string value in var w
  • 无法生成表“用户”

    当我安装时FOS用户包 官方文档 https github com FriendsOfSymfony FOSUserBundle blob master Resources doc index md 我尝试生成我的表fos user使用这个
  • 在 Symfony2 控制器中处理 Ajax 错误

    我正在尝试处理 Ajax 中的错误 为此 我只是想重现这个那么问题 https stackoverflow com questions 407596 how do you handle errors from ajax calls在交响乐中
  • Symfony2 获取实体的验证约束

    我正在研究一种获取实体的所有验证约束的方法 我想要实现的是以 JSON 格式返回此数据并使用 JQuery 验证插件在客户端应用相同的约束 但是我在获取约束时遇到了一些麻烦 这是我当前的代码 metadata new Symfony Com
  • Symfony2 用于子域路由的多个配置和路由文件

    我们正在构建一个 Symfony2 应用程序 它将使用子域为不同部分提供服务 api tld com API 系统 docs tld com 文档 asset tld com 图像服务系统 我们的做法是为每个子域创建一个应用程序目录 并将标
  • Symfony2.1 - 使用 DataTransformer 时选项“em”不存在

    我在用this http symfony com doc master cookbook form data transformers html在 Symfon 2 1 中添加数据转换器的食谱食谱 但我收到以下错误 The option e
  • Symfony 2.1 安全跨子域

    在应用程序上运行 Symfony 2 1 我们有不同的代码沙箱 例如 aequasi someurl com dev someurl com hotcarl someurl com 我似乎不明白为什么 但是当我登录时aequasi 我去ho
  • 如何向 Symfony 2.1 添加命名空间?

    我有一个使用命名空间的第三方库 我想将其添加到供应商目录中 由于某些原因 我无法为此库使用作曲家 使用 ClassLoader 的 add 方法添加它对我不起作用 找不到类 详细地 我正在使用 Symfony 2 1 7 app autol
  • 如何在 Symfony2 表单中为集合添加自动完成字段并使用 Propel?

    我将 Symfony 2 1 表单与 PropelBundle 一起使用 并且尝试重构一个具有对象下拉列表 可供选择 的表单 以代替使用 jquery 自动完成字段 使用 AJAX 对于下拉列表 我在表单类型中使用了以下代码 对于下拉列表来
  • Symfony 2.1 Doctrine 过滤器(启用/禁用)

    我目前正在实施 Doctrinefilters http docs doctrine project org en latest reference filters html在我的 Symfony2 1 项目中 具有以下设置
  • Symfony 2 - 在 Amazon S3 上上传图像的最佳实践

    我有一个表格 其中有一个file字段上传图像 我需要将此图像上传到 Amazon S3 一步一步构建这个 我开始将图像上传到本地磁盘上 现在它可以工作了 上传发生在我的实体内部Page因为建议在保存实体之前测试上传是否成功 我最终得到了这段
  • symfony 2 中相同的 url 需要多个角色

    这是我的 security yml 的访问控制列表的样子 access control path admin roles IS AUTHENTICATED FULLY path admin roles ROLE ADMIN 我想要做的是 用
  • 将自定义列添加到 Propel 模型?

    目前我正在使用以下查询 claims ClaimQuery create c gt leftJoinUser gt withColumn CONCAT User Firstname User Lastname name gt withCol
  • 未绑定表单字段的验证

    我有一个表单 其中使用 property path gt false 添加了额外的未绑定字段 我想在这个领域进行简单的验证 我发现很多答案建议使用类似的东西 builder gt addValidator 但我发现在 symfony 2 1
  • Symfony2 KnpMenuBundle:设置活动菜单项,即使它不在该菜单上

    我创建了菜单生成器并且它可以工作 我的路线之一是 database 但这有一个子路线 database view id 我不想将视图路线放入菜单项中 因为没有 ID 它就无法工作 但我希望当用户在视图上时数据库路由处于活动状态 我怎样才能做
  • 不需要 UserProvider 的自定义身份验证

    我在网上寻找适合我的配置的解决方案 但找不到满足我需求的东西 到目前为止 我已经为此工作了整整三天 但我无法使其正常工作 我确信有几件事我不明白 我正在分支 2 1 上开发我的 symfony 应用程序 为了让这个简短 我有一个网络服务 我
  • Symfony2 - 表单和 Twig 模板中的整个子实体

    在 Sonata 管理表单中 我想显示与当前对象相关的所有图像 不需要编辑它们 我设法使用实体字段类型及其属性选项来选择图像 URL 作为标签 以便我可以调用模板中的所有图片 gt add image entity array class

随机推荐

  • 如何将tools.jar添加为sbt中的“动态依赖项”。是否可以?

    我需要在我的项目中使用tools jar 但是将其打包在jar中没有多大意义 因为用户已经拥有它 那么 是否可以将其用作 动态依赖项 意思是 我希望我的代码compile通过使用tools jar文件发现于my JAVA HOME 但我不希
  • 使用 WinApi 函数在 FMX 画布上绘图

    这个问题看起来很简单 使用 VCL 可以正常工作 图像是 VCL 上的 TImage procedure TFormMain btnDrawBackgroundClick Sender TObject var theme HTHEME be
  • 无法在 android studio 中加载包装器属性

    请帮助我 当我在 android studio 中创建一个新项目时出现错误 无法从 C Users baren AndroidStudioProjects ToyaGarage gradle wrapper gradle wrapper p
  • 无法在 Android Studio 中的项目结构上添加模块

    结构项目窗口不显示所有选项 我无法添加库或模块 Check the image And this is how it should look with all the options 我尝试修复重新安装 android studio 但没有
  • 使用 CGRectZero 在 UIView 类或子类上调用 initWithFrame 意味着什么?

    我见过调用的代码initWithFrame of a UIView子类 例如UILabel with CGRectZero一切似乎都进展顺利 实例化一个是什么意思UIView具有 2D 点的子类 这似乎是CGRectZero is 它只是意
  • Dplyr,非标准评估和 Walrus 运算符和 curly-curly

    一个真正的问题 每当我需要编写 dplyr 函数时 我都会随机应变 我知道卷曲运算符可以大大简化任务 https www tidyverse org blog 2019 06 rlang 0 4 0 https www tidyverse
  • 如何使用 javascript 客户端设置 Python 服务器端

    因此 已经设置了一个在我必须构建的控制台上运行的 Python 程序 我将使用 Javascript 为应用程序构建一个 Web GUI 界面 我会怎样 A 继续处理该 Python 程序的输入 输出 而无需触及原始代码 b 通过 Java
  • 为什么我收到“Proto 类已在文件中定义”?

    第一个原型文件 main proto 位于offline目录 option java package com xxx proto option java outer classname Service1 option java multip
  • Android在布局中绘制分隔线/分隔线?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想在布局的中间画一条线 并将其用作其他项目 如 TextView 的分隔符 有没有一个
  • OpenCV - 将 PNG 的透明部分变成白色

    我是 OpenCV 的新手 所以如果我的问题对你来说很愚蠢 请耐心等待 I have a set of images that all have a transparent border on the left and right like
  • 无法解决Python中的TypeError消息

    我一直在四处寻找 以检查为什么在第 7 行有一个 TypeError 它表示我的参数在字符串格式化期间没有转换 但可以使用 这里有没有人能够帮助我并让我知道我的代码到底出了什么问题 以便我能够纠正自己 以下是我的代码的参考 import s
  • 为什么 GETDATE() 不能用作过程参数的默认值或 EXECUTE 语句中的值?

    考虑以下存储过程 CREATE OR ALTER PROCEDURE MySchema MyProcedure myDateTimeParam DATETIME GETDATE AS BEGIN Do something spectacul
  • YouTubePlayerAPI 分发时间表?

    当我发现这个时我非常兴奋谷歌IO视频 http youtu be 3WFsx u q3Y最近 与当前选项 意图 iframe 嵌入 相比 轻松向应用程序添加 YouTube 功能非常有吸引力 令我惊讶的是 尽管距离发布已有几个月了 但除了这
  • 数据融合 - http post 插件问题

    我正在尝试使用 DataFusion 进行 http 调用 来源 GCS csv 文件 接收器 HTTP POST API 期望该文件作为 HTTP 请求的一部分 执行此操作后 我在 API 日志中收到以下错误 所需的请求部分 文件 不存在
  • 在锚链接中添加工具提示[重复]

    这个问题已经存在了 我想在文本中添加工具提示 例如 如果我有这样的代码 a href http google com title Google a 鼠标悬停时 我想显示该工具提示 使用title这是一个好方法 但是我怎样才能让它看起来更好呢
  • Excel 2010:通过外部连接替换表格而不影响其他工作表

    我有一本包含大量数据的大工作簿 在一张纸上我有一张桌子 该表用于其他工作表中使用的许多数据透视表 这些数据透视表也用于其他工作表中 该表的数据是定期手动复制的 我现在有一个外部连接可以自动导入数据 但我想避免影响其他工作表 如何使用外部连接
  • 在 ruby​​ on Rails 4 中上传图像或文件

    在这里 我想要一个关于在不使用任何 gemfile 例如 peperclip carrierwave 等 的情况下上传文件或图像的清晰概念 之前 我做了一些工作 我可以在 assets images 文件夹中上传图像 但是当我在显示页面中调
  • 转置逗号分隔字段

    我有一个如下所示的数据集 并且正在使用 SAS Enterprise Guide 6 3 data have input id state cards 134 NC NY SC 145 AL NC NY SC run 我有另一个数据集 其中
  • 像 MySQL 一样从 Firebase 检索计数数据

    当尝试从 MySQL 数据库中提取数据时 我可以执行以下操作 SELECT FROM users ORDER BY id WHERE vehicle car 例如 这应该让我获得所有驾驶汽车的用户 而不是显示驾驶摩托车的用户 Firebas
  • 表单:避免将非提交字段设置为 null

    我有一个简单的模型 源简化 class Collection public page public limit 以及表单类型 class CollectionType extends AbstractType public function