Symfony表单生成 - 为什么?

时间:2011-02-03 09:52:46

标签: php forms symfony1

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

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

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

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

对此有何看法?

3 个答案:

答案 0 :(得分:6)

因为在大多数情况下,所使用的字段类型与架构列非常相似,假设您首先设计了正确的架构;-)例如varchar(200)转换为单行文本输入, MySQL longtext转换为textarea等。快速简单然后移动到渲染,可能需要几次调整。生成的表单类还为您提供了一个弹出窗体小部件验证器以进行表单验证的位置。

你当然可以在任何你想要的地方使用验证器类,但是我觉得表单框架很好地封装了它。

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

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

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

编辑2 基本上我要传达的是,您将始终能够找到Symfony中的表单框架不适合的角落案例。您将能够找到每个框架中的每个组件;-)但是在大多数情况下,它可以很好地完成工作并且相对容易。如果你发现自己不断反对它,那么我建议你从错误的角度来看它,或者你刚刚发现了上面提到的所有角落情况: - )

答案 1 :(得分:4)

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

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

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

作为一个加号: 自第一个版本以来,Symfony表单框架总是受到巨大重构的影响,从1.1到1.3它们总是改变它,据我所知,2.0版本也会完全不同(它也将是一个独立的捆绑和可以在Symfony之外重复使用)。因此,如果您没有找到当前的表单框架,我并不感到惊讶,他们也不太满意(据我所知)。

答案 2 :(得分:2)

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

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