2015-07-04 119 views
1

通过请求对象在SF2中检索会话。嗯,当考虑一些架构时,这会成为一种有问题的情况 - 在服务中需要访问会话变量的情况下。会话和请求对象困境

或者,在这件事上我不太正确? (希望如此)。

很明显,用户通过网页浏览器发送的每个请求都是的请求。所以只要我们在标准SF2中使用控制器动作,我们就有请求。但是,我们是否应该将Request对象传递给我们需要的任何服务?

将Request对象传递给所有需要运行它们的方法的服务(例如,存储信息,检查设置,放置用于显示数据的过滤器等等 - 在一些更大的应用程序中,它们相当多),因为它可能因为依赖服务需要,对我来说似乎是一个非常愚蠢的想法。它也打破了OOP推荐的S.O.L.I.D.中的“S”。

于是我想出了一个结论,我必须要么:

  1. 请求传递OBJ许多服务只是因为依赖服务可能需要从它的一些数据(即打破“S “)如上所示)

  2. 每次我需要每一个控制器动作(即代码复制)时,都会从请求中检索和处理数据 - 在这种情况下,我没有传递Request obj,但是之前准备好了所有需要的数据 - 但我必须在很多时候做到这一点在几乎所有控制器的操作方法(检索/从请求处理的数据仅仅是一个简单的调用另一个服务,但那就不是集中)

我把这个问题,因为我有例如下面要解决的问题:

  1. 我使用的是相同的过滤器对所有不同的数据(从不同的数据源)的整个页面上。

  2. 过滤器可以启用和禁用 - 他们应该记住所有页面的单次

  3. 我决定拯救“已禁用”过滤器会话可能是最好的办法(因为默认情况下所有的数据应该可以看出,即所有过滤器应为“使能”状态)

第三点 - 保存数据(过滤器)的会话 - 是什么使麻烦SF2,如上所述。为了在页面上显示过滤的数据,我需要访问一个会话,从而访问Request obj。这意味着我在SOLID中保留“S”是有困难的,因为依赖于服务的方法总是将Request obj传递给它。

是否还有其他更好的解决方案(比如上面提到的2个解决方案(即一个,打破SOLID或两个代码复制)?

回答

2

该会话也是symfony di容器中的服务,您可以简单地将会话注入到您的服务中