我问的是使用Symfony2进行过滤的最佳策略是什么。
我想过滤一个实体(酒店)表。这个过滤器应该允许我:
首先,我想在HotelController上构建过滤器表单。提交过滤器后,我发送的每个$ _POST都有一个FlashBag,重定向到同一页面,如果有FlashBag,我会向$ reponse发送cookie。然后我显示使用cookie上的数据过滤的表格。
但我真的不喜欢这个,因为我在HotelController上有一个非常大的indexAction(),我认为将$ _POST更改为FlasBag到Cookie是不是很干净,是吗?我执行此重定向,因为刷新页面,数据不会再次发布。
我也问一个问题,防止一个太大的IndexAction()方法,我可以把一些代码放到另一个方法,例如PostToFlashBag()和另一个FlashBagToCookie(), 或Controller上的每个方法都必须以“Action”结尾,并且必须可以通过路由器访问?
然后,我想到另一件事:有一个实体“过滤器”,我需要的每一行。例如“WithEmail”,“DisplayTel”等。然后我可以轻松地构建FilterType,并更新Filter权限,重定向到同一页面(再次,以防止在用户刷新页面时重新发布数据)。最后,我可以使用对象Filter显示表,并在HotelRepository上显示方法。
这看起来很棒,但我有点担心,因为过滤器实体只有一个条目,我必须找到过滤器(1)。 由于MVC,只有一个条目的模型是否正确?
你会选择哪种策略(可能是另一种策略)?我很有兴趣学习MVC和Symfony2 devloppemnt的良好实践。
答案 0 :(得分:2)
拥有一个专用的模型类 - 让我们称之为Filter
- 它将接收用户输入的值,这绝对是可行的方法。
此外,在此输入上使用Symfony2表单,因此您可以进行验证,并确保withEmail
完全是布尔值等。从您Filter
,构建SQL / Doctrine查询并返回控制器必须返回的内容,无论是视图还是原始数据。
您可以在控制器中使用所需的任何方法。毕竟,Symfony2中的控制器是普通的旧PHP对象。他们只需实施ContainerAwareInterface
。通常它们会继承Controller
,但此继承只会带来一些代理方法,例如getDoctrine
或render
。
唯一的惯例是用作路线的方法必须以Action