symfony表单,实体中只有getter方法

时间:2015-10-20 09:05:07

标签: php forms symfony

我想创建一个只在实体中使用getter方法的表单...因为我正在处理现有的数据库,它不需要存储或操作数据。

因此,我只使用Getter方法而不使用Setter方法为产品创建了实体。

然而,当我创建表单(如带有一些下拉菜单的搜索查询等)时,它总是在寻找set或Add方法。是否有可能只使用getter从数据库中获取数据。

我不希望将来随时修改数据。

我尝试使用“read_only”,但它仍然会出现关于setter和addMethod()的错误

http://symfony.com/doc/current/reference/forms/types/form.html#read-only

编辑:

我想创建一个下拉菜单ProductGroupcategory-> productSubcategory - >产品

像这样(提前搜索):http://www.buycarspares.co.uk/

完整代码:

https://gist.github.com/anonymous/8b2e576e69b1588e4f21

2 个答案:

答案 0 :(得分:0)

关系需要add-和get-methods,因为它是关于对象的数组或arrayCollection而不是关于正常实体属性(如字符串)的getter或setter。

答案 1 :(得分:0)

是的,虽然有些人可能会认为解决方案比问题更糟糕。您当然可以声明您的实体属性是公开的。这不仅可以避免限制者,也可以避免吸毒者。 Doctrine 2的延迟加载功能不起作用。

一种更高级的方法,它可以实现表单组件使用属性访问对象与实体之间传输数据。这就是“添加”和“设置”消息的来源。属性访问对象也允许您使用数组和实体。 http://symfony.com/doc/current/components/property_access/introduction.html

表单组件允许您插入自己的属性访问对象,这意味着您可以创建自己的访问对象,该对象可以使用Reflection直接写入私有/受保护变量。顺便说一句,这与Doctrine 2使用数据库信息来保护实体的技术相同。

当然,我已经听说过这种方法的抗议主要是关于违反封装。但是在投票之前考虑一下。表单组件实际上只是持久化并从html文档中检索实体的状态。正是Doctrine 2的作用。只要您不滥用该技术,就没有违规行为。

我经常使用这种方法来避免编写无尽的getter和setter。似乎在实践中工作得很好。