1

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

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

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

首先,我想在 HotelController 上构建过滤器表单。提交过滤器后,我为每个发送的 $_POST 提供一个 FlashBag,重定向到同一页面,如果有 FlashBag,我将 cookie 发送到 $reponse。然后我显示使用 cookie 上的数据过滤的表格。

但我不太喜欢这样,因为我在 HotelController 上有一个非常大的 indexAction(),而且我认为将 $_POST 更改为 FlasBag 为 Cookie 并不是很干净,是吗?我做这个重定向,因为刷新页面,数据不会再次发布。

我也在问一个问题,为了防止 IndexAction() 方法太大,我可以将一些代码放到另一个方法中吗,例如方法 PostToFlashBag() 和另一个 FlashBagToCookie(),或者 Controller 上的每个方法都必须以单词“Action”并且必须可以通过路由器访问

然后,我想到另一件事:有一个实体“过滤器”,我需要的每一行。例如“WithEmail”、“DisplayTel”等。然后我可以轻松地构建一个 FilterType,并更新过滤器实体,以重定向到同一页面(同样,如果用户刷新页面,防止重新发布数据)。最后,我可以使用 HotelRepository 上的方法显示带有对象过滤器的表。

这看起来不错,但我有点担心,因为过滤器实体只有一个条目,我必须找到过滤器(1)。由于 MVC,只有一个条目的模型是否正确

你会选择什么策略(也许是另一种策略)?我很高兴学习 MVC 和 Symfony2 devloppemnt 的良好实践。

4

1 回答 1

2

拥有一个专用的模型类——让我们称之为Filter——将接收用户输入的值,绝对是要走的路。

此外,在此输入上使用 Symfony2 表单,这样您就可以进行验证,并确保它确实withEmail是一个布尔值等。从您Filter那里,构建您的 SQL/Doctrine 查询并返回您的控制器必须返回的内容,无论是查看或原始数据。

您可以在控制器中使用任何您想要的方法。毕竟,Symfony2 中的控制器是普通的旧 PHP 对象。他们只需要执行ContainerAwareInterface。通常它们继承Controller,但是这种继承只带来了一些代理方法,比如getDoctrineor render

唯一的约定是用作路由的方法必须以Action

于 2013-01-22T10:40:56.670 回答