我想创建一个只在实体中使用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/完整代码:
答案 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。似乎在实践中工作得很好。