【问题标题】:Log PHP exceptions and Errors to Database table PHP Slim 3将 PHP 异常和错误记录到数据库表 PHP Slim 3
【发布时间】:2020-09-24 12:15:49
【问题描述】:

所以我试图找到让 PHP SLIM 3 将 PHP 异常和错误记录到数据库表而不是日志的最佳方法。实现这一目标的最佳方法是什么?到目前为止,文档中建议这样做。

依赖:

$app = new \Slim\App();
$c = $app->getContainer();
$c['errorHandler'] = function ($c) {
    return function ($request, $response, $exception) use ($c) {
        return $response->withStatus(500)
            ->withHeader('Content-Type', 'text/html')
            ->write('Something went wrong!');
    };
};

我无法理解的是我在哪里调用它以及如何连接它以将其记录到我创建的数据库表中。有任何想法吗?

【问题讨论】:

  • 您没有显式调用此函数,它会在发生异常时自动调用。您只需以您认为合适的方式编写函数,即编写它以便能够在 db 中记录错误。

标签: php mysql error-handling slim slim-3


【解决方案1】:

你为 Slim 3 试过这个吗?


$config = [
    'settings' => [
        'displayErrorDetails' => true,

        'db' => [
            'driver' => 'mysql',
            'host' => 'localhost',
            'username' => 'root',
            'database' => 'test',
            'password' => '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
           'flags' => [
               PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
           ],
        ]
    ],
];

$app = new \Slim\App($config);

$container = $app->getContainer();

$container[PDO::class] = function ($container) {
    $settings = $container['settings']['db'];

    $host = $settings['host'];
    $dbname = $settings['database'];
    $username = $settings['username'];
    $password = $settings['password'];
    $charset = $settings['charset'];
    $flags = $settings['flags'];
    $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";

    return new PDO($dsn, $username, $password, $flags);
}

$container[PDO::class] = function ($container) {
    $settings = $container['settings']['db'];

    $host = $settings['host'];
    $dbname = $settings['database'];
    $username = $settings['username'];
    $password = $settings['password'];
    $charset = $settings['charset'];
    $flags = $settings['flags'];
    $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";

    return new PDO($dsn, $username, $password, $flags);
};

$container ['errorHandler'] = function ($container ) {
    $connection = container[PDO::class];

    return function ($request, $response, $exception) use ($connection) {

        $row = [
            'message' => $exception->getMessage(),
        ];

        $sql = "INSERT INTO error_logs SET message=:message";

        $connection->prepare($sql)->execute($row);

        return $response->withStatus(500)
            ->withHeader('Content-Type', 'text/html')
            ->write('Something went wrong!');
    };
};

【讨论】:

  • 谢谢@odan,但是,我怎么称呼它,在哪里?我会在我的 try and catch 场景中调用它吗?
  • 就像尼玛说的,你不必调用它。当发生错误/异常时,会自动(由 Slim)调用此回调函数。顺便说一句:你为​​什么不使用 Slim 4?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2020-06-03
相关资源
最近更新 更多