如何在生产环境中使用zend框架2隐藏PDOException



我们将zend框架2用于web应用程序。

我们似乎在生产环境中禁用了error_reporting和display_errors。

但是,如果发生SQL错误(它不应该在生产中,但…:-)),则仍然显示异常:

PDOException
File:
[...]/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php:165
Message:
SQLSTATE[42000]: Syntax error or access violation

查询使用Doctrine\DBAL\语句(Doctrine2)。

我们找不到全局捕获此异常的位置。

确保您有正确的view_manager配置设置。

// config/autoload/global.php
return array(
    'view_manager' => array(        
        'display_not_found_reason' => false,
        'display_exceptions'       => false,
    ),
);

请记住,此配置是合并的;如果它在主global.php中,它将优先于module.config.php

它的工作原理

每次ZF2遇到错误(异常)时,它总是捕获错误。不是在屏幕上"重新思考"异常信息,而是将信息添加到MVC事件中,并触发"错误"事件(dispatch.errorrender.error,取决于它在调度循环中的位置)。

ZendMvcViewHttpViewManager附加"错误侦听器"来处理这些事件(通常用于显示错误模板)。如果使用的是标准骨架应用程序,则默认错误模板将选中display_exceptions选项,并且仅在启用该选项时才呈现错误。

内部:Zend\Db\Adapter\Driver\Pdo\Connection

搜索线路:

$this->resource = new PDO($dsn, $username, $password, $options);
$this->resource->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

并将其更改为:

$this->resource = new PDO($dsn, $username, $password, $options);
$this->resource->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);

我不知道是否有一种方法可以在不更改库本身的情况下全局覆盖它。。

这就是我的做法,在index.php 中

try {
    include ROOT . '/init_autoloader.php';
    ZendMvcApplication::init(include 'config/application.config.php')->run();
} catch (Exception $e) {
    if (IS_DEVELOPMENT_SERVER)
        throw $e;
    else {
        echo('Error : ' . $e->getCode() . " " . $e->getMessage());
    }
}

最新更新