我应该从控制器传递会话数据,还是在服务层中读取它?

时间:2013-02-19 05:05:28

标签: php oop design-patterns

我在PHP中有一个相当典型的MVC应用程序。我经常需要从会话中获取数据,但我不确定是否应该在控制器或服务中执行此操作。

例如,如果请求命中domain.com/user/edit,我的控制器可以从会话中获取当前用户并将其传递给服务,或者服务可以访问会话本身。

如果我在服务中执行此操作,则会在服务层和会话对象之间创建依赖关系。如果我在控制器中执行此操作,则会使控制器变得更胖。

我知道这只是一个小问题,但我在会话中存储了很多(小)变量,而我的请求的参数处理本身就非常复杂。

谢谢!

2 个答案:

答案 0 :(得分:3)

简短回答:

现在有点孤独的解释......

从架构的角度来看,会话是存储的形式。在PHP中,操纵它实际上是哪种类型的存储非常容易。

MVC中的服务是模型层的一部分,它处理应用程序逻辑。那就是 - 它处理domain objects和存储抽象之间的交互(通常直接或间接地实现为data mappers)。

因此,您应该将$_SESSION访问(也是初始化)抽象为某种SessionMapper,它可以处理域对象的整体存储或仅存储来自这些域对象的特定参数

由于会话(通常)是执行中的单一结构(如果请求),您可以通过确保生成数据映射器的Factory仅创建一个所述SessionMapper的实例来强制执行该操作。

服务仅使用此(通过工厂共享)会话映射器,控制器对此一无所知。

答案 1 :(得分:-3)

$_SESSION是一个全局变量。为什么你必须传递可以全局访问的东西?

除非需要验证会话数据并且需要以某种方式准备其数据,否则无需将这些变量传递给控制器​​类。