我在 PHP 中有一个相当典型的 MVC 应用程序。很多时候我需要从会话中获取数据,但我不确定是否应该在控制器或服务中执行此操作。
例如,如果请求命中domain.com/user/edit
,我的控制器可以从会话中获取当前用户并将其传递给服务,或者服务可以访问会话本身。
如果我在服务中这样做,它会在服务层和会话对象之间创建依赖关系。如果我在控制器中这样做,它会使控制器变得更胖。
我知道这只是一个小问题,但我在会话中存储了很多(小)变量,并且我的请求的参数处理本身就非常复杂。
谢谢!
我在 PHP 中有一个相当典型的 MVC 应用程序。很多时候我需要从会话中获取数据,但我不确定是否应该在控制器或服务中执行此操作。
例如,如果请求命中domain.com/user/edit
,我的控制器可以从会话中获取当前用户并将其传递给服务,或者服务可以访问会话本身。
如果我在服务中这样做,它会在服务层和会话对象之间创建依赖关系。如果我在控制器中这样做,它会使控制器变得更胖。
我知道这只是一个小问题,但我在会话中存储了很多(小)变量,并且我的请求的参数处理本身就非常复杂。
谢谢!
简短的回答:两者都不是。
现在有点孤独的解释......
从架构的角度来看,会话是一种存储形式。在 PHP 中,很容易操作它实际上是哪种类型的存储。
MVC 中的服务是处理应用程序逻辑的模型层的一部分。也就是说 - 它处理域对象和存储抽象之间的交互(通常直接或间接实现为数据映射器)。
因此,您应该将访问(也是初始化)抽象$_SESSION
为某种SessionMapper
,它可以处理整个域对象的存储或仅存储来自这些域对象的特定参数。
并且由于 session (通常)是您执行中的一个单一结构,如果请求,您可以通过确保Factory
生成数据映射器的 仅创建一个实例来强制执行SessionMapper
。
服务仅使用此(通过工厂共享)会话映射器,控制器对此一无所知。
$_SESSION
是一个全局变量。为什么一定要传递可以全局访问的东西?
除非需要验证会话数据并且需要以某种方式准备其数据,否则无需将此类变量传递给控制器类。