我在一个经常使用会话的项目中工作。我们有一个数据库处理程序(Zend 的标准处理程序),目前我在 preDispatchLoop 的插件中有这个初始化(数据库处理程序 + 会话启动)。以前它在 preDispatch 中,但由于每个操作都调用它(包括“转发”操作中的那些,它给我带来了问题。
我的问题是我开始从事国际化工作,并开始使用路由器来检测 URI 中的语言:我们使用 /language/controller/action 形式)。路由器想使用会话来读取/存储语言。但是您可能知道路由器首先出现,然后是(前/后)调度程序的东西。
所以问题是:为什么不将会话初始化移动到引导程序?这是因为它以前就在那里,但我不得不移动它,因为我需要测试数据库(记住会话使用数据库)是否可以访问以防止错误。如果出现错误,我只需重定向(request->setController/setAction 错误)。如果我将会话初始化代码移回引导程序,如果无法访问数据库,我将无法进行重定向。
我读过其他问题,我发现很多人要求从引导程序访问请求对象。但他们都说:你可以但不应该。但是,在这种情况下我该怎么办?我的最后一个选择是将会话初始化移回引导程序,如果失败,手动发送标头并读取视图但错误代码,但这是一个可怕的黑客攻击。
我的想法是不应该那么早使用会话。不应在引导过程中调用它们,因为它们尚未完全了解请求的控制器/操作。我认为要获得语言,我可以简单地依赖 cookie(手动)并从那里(以及从 URI)获取它。如果最终有一天会话信息必须在引导中使用,我将使用全局变量。
你怎么看 ?我控制应用程序的方式有错误吗?
看到的一些问题:
(Zend 版本 1.9.6,不使用 Application 或 Bootstrap)