Symfony2和过滤器,正确的策略

时间:2013-01-22 10:15:13

标签: model-view-controller symfony filter

我问的是使用Symfony2进行过滤的最佳策略是什么。

我想过滤一个实体(酒店)表。这个过滤器应该允许我:

  • 选择带或不带电子邮件的酒店,有或没有网站等。
  • 根据州和/或城市选择酒店(关系OneToMany)
  • 选择要在桌面上显示的信息以及复选框(例如在酒店桌上显示“电子邮件地址”,但不显示“tel”或“网站”)。

首先,我想在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的良好实践。

1 个答案:

答案 0 :(得分:2)

拥有一个专用的模型类 - 让我们称之为Filter - 它将接收用户输入的值,这绝对是可行的方法。

此外,在此输入上使用Symfony2表单,因此您可以进行验证,并确保withEmail完全是布尔值等。从您Filter,构建SQL / Doctrine查询并返回控制器必须返回的内容,无论是视图还是原始数据。

您可以在控制器中使用所需的任何方法。毕竟,Symfony2中的控制器是普通的旧PHP对象。他们只需实施ContainerAwareInterface。通常它们会继承Controller,但此继承只会带来一些代理方法,例如getDoctrinerender

唯一的惯例是用作路线的方法必须以Action

结尾