Session Zend framework—当路由器需要访问会话时,在何处初始化会话

Session Zend framework—当路由器需要访问会话时,在何处初始化会话,session,zend-framework,router,bootstrapping,Session,Zend Framework,Router,Bootstrapping,我在一个经常使用会话的项目中工作。我们有一个db处理程序(来自Zend的标准处理程序),目前我在preDispatchLoop的插件中有这个初始化(db处理程序+会话启动)。以前它是在preDispatch中,但由于每次操作都会调用它(包括“转发”操作中的操作),因此它给我带来了问题 我的问题是,我开始从事国际化工作,并开始使用路由器来检测URI中的语言:我们使用表单/语言/控制器/操作)。路由器希望使用会话来读取/存储语言。但是你可能知道,路由器是第一位的,然后是(前/后)调度器 所以问题是:

我在一个经常使用会话的项目中工作。我们有一个db处理程序(来自Zend的标准处理程序),目前我在preDispatchLoop的插件中有这个初始化(db处理程序+会话启动)。以前它是在preDispatch中,但由于每次操作都会调用它(包括“转发”操作中的操作),因此它给我带来了问题

我的问题是,我开始从事国际化工作,并开始使用路由器来检测URI中的语言:我们使用表单/语言/控制器/操作)。路由器希望使用会话来读取/存储语言。但是你可能知道,路由器是第一位的,然后是(前/后)调度器

所以问题是:为什么不将会话初始化移到引导模式?这是因为它以前就在那里,但我必须移动它,因为我需要测试db(记住会话使用db)是否可以访问以防止错误。如果有错误,我只需重定向(请求->设置控制器/setAction错误)。如果我将会话初始化代码移回引导,那么如果数据库不可访问,我将无法进行重定向

我读过其他问题,发现很多人要求从引导程序访问请求对象。但他们都说:你可以,但不应该。但是,在这种情况下,我该怎么办?我的最后一个选择是将会话初始化移回引导,如果它失败,手动发送头并读取视图,但是错误代码,但这是一个可怕的黑客行为

我的想法是不应该这么早就开始上课。在引导过程中不应该调用它们,因为它们还没有完全了解所请求的控制器/操作。我认为要获得这种语言,我可以简单地依赖cookies(手册)并从那里获得它(以及从URI)。如果最终有一天会话信息必须用于引导,我会使用一个全局变量

你觉得怎么样?我控制应用程序的方式是否有错误

我们看到了一些问题:


(Zend版本1.9.6,不使用应用程序或引导)

我会将会话初始化和db连接移动到引导。
如果在引导过程中无法连接到数据库,这将被视为低级错误。在生产中也不例外。
只需将引导过程包装到try-catch块中,就可以输出错误页面

// in your index.php
try {
    $application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );

    $application->bootstrap()
                ->run();

} catch (Exception $e) {
    header('Content-type: text/html; charset=utf-8');
    header('HTTP/1.1 503 Service Unavailable');
    header("Retry-After: 3600");
    // Output some error page.
    echo "<html><head><title>System Error</title></head><body>...</bod></html>";
?>
//在index.php中
试一试{
$application=新的Zend_应用程序(
应用程序(环境),
应用程序路径。“/configs/APPLICATION.ini”
);
$application->bootstrap()
->run();
}捕获(例外$e){
标题('Content-type:text/html;charset=utf-8');
标头(“HTTP/1.1 503服务不可用”);
标题(“在3600之后重试”);
//输出一些错误页面。
回显“系统错误…”;
?>

不清楚为什么不能引导数据库,然后是会话,然后进行路由。如果数据库不可访问,为什么需要会话来重定向?因为如果我有错误,我不能重定向。我无法直接访问引导中的请求对象,尽管我可以得到它,但我不应该(这是我一直在读的内容)这就是为什么我将db(和会话)初始化代码移动到一个插件中,以便能够在出错时重定向。但是这些插件只有在路由器之后才会被调用(请参阅中的流程)。我不需要会话在出现错误时重定向。最后,我所做的只是停止在引导中使用会话信息。谢谢。我还认为db和会话应该属于引导,但在引导文件(或任何包含的文件)中发送头并回显不是显示错误页面的“Zend方式”。并且我们没有(直接)访问请求以进行重定向。我有一个错误控制器,带有日志记录、发送电子邮件和一个很好的视图,我只是想让它成为“Zend方式”。我认为这是一个鸡和蛋的问题。我也使用错误控制器、loggin等。但是有些错误你无法用“Zend方式”捕获和处理因为它们出现得很早。请考虑您的application.ini是否不可读。您的应用程序现在做什么?因此仍然需要低级别处理。