【问题标题】:Symfony form generation - why?Symfony 表单生成 - 为什么?
【发布时间】:2011-02-03 09:52:46
【问题描述】:

我一直在思考这个问题 - 我从来没有完全理解为什么要以编程方式生成所有表单,除非它们是完全动态的。但根据我的经验,大多数都是静态的。

现在,进入手头的主要问题 - 使用 Symfony,它会根据您关联模块的表(在构建模块时)为您生成所有表单。我的问题是,为什么要生成这些表单?在大多数情况下,这些是静态表单,应该很容易在模板中进行编辑。

对我来说,主要问题是您是否拥有一支由后端和前端开发人员组成的团队,例如,也许还有一些设计师。并且设计人员或前端开发人员(可能有也可能没有太多或任何 PHP 经验)希望在包含所有视图的模板目录中更改表单(出于审美目的)。好吧,他们真的不能,因为它都是由专门为该表单构建的表单类生成的。那么,现在他们需要回到后端开发人员并要求他们为他们更改东西吗?

我可能错过了表单生成的重点,但我看到它的方式 - 如果它是静态的,则无需以编程方式生成它,但如果它是完全动态的,那么是的,没关系。

对此有何看法?

【问题讨论】:

  • 不知道 Symfony。但程序化表单生成方法通常是惰性解决方案。对于框架的开发人员。加速解析 HTML5
    (或 XForms)并将其用于交互是完全可行的。但可惜,还没有人尝试过。
  • 是的,我正在考虑忽略表单生成,而只是在模板文件中手动创建静态表单。无论如何,我真的很鄙视大多数表单库。不过,很高兴获得其他人对此的看法。

标签: php forms symfony1


【解决方案1】:

因为在大多数情况下,使用的字段类型与架构列非常相似,假设您首先设计了正确的架构;-) 例如 varchar(200) 转换为单行文本输入,即 MySQL 长文本翻译成文本区域等等。经过几次调整后,可以快速简单地进行渲染。生成的表单类还为您提供了一个弹出所有表单小部件验证器以进行表单验证的地方。

您当然可以在任何地方使用验证器类,但表单框架很好地封装了这一点。

虽然呈现表单是一个单独的问题 - 正如您所提到的,您对此有一个看法。 Symfony 中的惰性方法是简单地执行<?php echo $form; ?>,但最好自己渲染各个字段,例如:<?php echo $form["fieldname"]->render(); ?> 等等。如果您的视图是这样的结构,那么您的前端开发人员应该能够根据需要对字段重新排序。

编辑:在渲染过程中添加类和其他属性:

<?php
  echo $form["fieldname"]->render(
    array("class" => "myNewClass", "title" => "My Title", ...)
  );
?>

编辑 2 本质上,我想传达的是,您总能找到一个极端情况,即 Symfony 中的表单框架不适合。您可能会为每个框架中的每个组件找到它;-) 但在大多数情况下,它可以很好地完成工作并且相对容易。如果您发现自己一直在与它作斗争,那么我建议您要么从错误的角度来处理它,要么您刚刚发现了上面提到的所有那些极端情况:-)

【讨论】:

  • 如果他们想做的不仅仅是重新排序字段怎么办?例如,如果他们想添加一个新类(用于新样式)或添加一个 alt 或 title 属性?名单无穷无尽……
  • 对我来说,这似乎是很多开销。所以你需要一个 Form 类,另外你需要回显每个字段(通过渲染方法)。所有这一切与仅仅这样做:&lt;input name='user' type='text' class='myNewClass' title='my title' /&gt; - 这对设计师来说要容易得多,因为他们已经知道 HTML4 或 5 语法。另外,这是静态的,那么为什么要以编程方式进行呢?我只是不明白这一点,除非表单将是完全动态的(在这种情况下,它们很可能不需要按设计进行编辑)。
  • 我认为您的设计师是设计而不是实施实际开发。如果您的设计在任何阶段都被签署,它可能是空输入元素、空链接等。作为开发人员,您的工作就是以最好的方式实现它。在大多数情况下,这是后端和前端开发人员一起工作。
  • 潜在的开销是更容易维护代码和单元测试分离的副作用。将表单框架(我敢说,ORM 也是如此!)抽象后,对这些组件进行单元测试就简单多了。
  • 回复您的Edit 2 - 我想这并不适用于每个项目或每个人。我可以看到它在某些情况下提高了生产力,但对于我正在做的事情,并不是真的。感谢您的意见:)
【解决方案2】:

表单生成是一项旨在解决特定问题的功能。主要问题是,大多数情况下,如果您创建一个模型对象,那么您将需要一个简单的表单,只包含您的字段,并且可以根据您的模型描述生成。

如果您想让您的应用程序“设计良好”,您的 BaseForm 类将包含模型对象的所有字段,您可以扩展这些类以创建特定的表单。例如,假设您有一个 User 对象,并且您希望根据注册人的年龄进行两种不同类型的注册。这两个表单将有 90% 相同,因此您可以使用 BaseUserForm 创建一个漂亮的设计,并根据您的需要使用两种不同的特定表单对其进行扩展。一个额外的好处是,当您想要更改列的名称时,您不必在很多地方都这样做,只需在一个地方进行,等等。

这个代码生成就像你使用 Propel 或 Doctrine 或其他什么时生成 ORM 文件一样,这些文件的大部分功能永远不会被使用,但它为你提供了一个很好的工具集用于开发.

另外: Symfony 表单框架自第一个版本以来一直是巨大重构的主题,从 1.1 到 1.3,他们总是改变它,据我所知,2.0 版本也将是完全不同的东西(它也将是一个独立的包和可在 Symfony 之外重用)。因此,如果您认为当前的表单框架没有用,我不会太惊讶,他们也不会太高兴(据我所知)。

【讨论】:

  • 我知道它是什么,它做什么以及它是如何工作的。我主要关心的是使用它的全部意义。在大型开发环境中,您有多个团队在同一个项目上工作,您将让设计人员查看模板并修改静态标记代码 (HTML)。这只会让他们和后端开发人员的事情变得更加困难,他们最终将不得不做所有事情。我之所以这么说是因为它发生在我身上......
  • 那么当前的表单框架并不能满足您的需求。我们也有同样的问题。可能问题是这个框架的设计目的仅在非常有限的情况下有用。
  • 是的,我同意 - 感谢不同的观点。
【解决方案3】:

大多数表单需要以编程方式生成,以便在提交时出现错误,可以验证错误并将表单返回给用户,部分预填,并酌情在标签中插入错误。

如果您的表单是静态的,则无法返回验证错误信息,也无法使用数据库或用户填写的字段中的数据预先填写表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2019-02-18
    • 2011-05-26
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多