当在路由之外抛出异常时,如何在Slim框架中传递错误页面?

 静静敲代码 发布于 2023-02-10 13:53

我试图围绕处理Slim框架应用程序中抛出的异常和最终页面传递的操作顺序.基本上,如果我在一个类中抛出一个Exception,我会喜欢Slim来提供我漂亮的Twig 500页面,但是当在路由之外抛出异常时,我甚至无法让Slim提供自己的正常错误页面.

鉴于此数据库类构造函数:

public function __construct(array $connection, \Slim\Slim $slim) {
  $this->slim = $slim;
  try {
    $this->db = new \PDO(...);
    $this->db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, FALSE);
    $this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
 } catch (\PDOException $e) {
    // How can I kill further execution here and have Slim deliver a 500?
 }
}

如果我跑,$this->slim->error();我得到Fatal error: Uncaught exception 'Slim\Exception\Stop'.

理想情况下,我想做的事情如下:

    记录下来 $this-slim->log->error("Unable to connect to database.");

    停止尝试在我的数据库类中执行进一步的操作(这将全部失败并抛出致命异常)

    通过500.twig模板文件传递页面.

任何帮助或方向将不胜感激.

1 个回答
  • 你正在陷入悲痛之中,因为还没有配置Slim的错误处理,因为你的应用程序永远不会让它一直到位\Slim\Slim::run().

    要做的两件事:

    1)我建议将您的数据库类(和其他类似的类)添加到Slim的依赖注入容器中.

    $app->container->singleton('db', function () use ($app) {
        return new Database($app);
    });
    

    这将允许延迟加载数据库连接.在使用之前,不会创建该类.那时,我假设在这里,你在一条路线中,\Slim\Slim::run()将被调用,并且Slim错误处理将会到位.

    2)既然在完全配置应用程序之前不会发生异常,您可以使用日志记录:

    public function __construct(\Slim\Slim $app) {
        $this->slim = $app;
    
        try {
            $this->db = new \PDO('sqlite:/does/not/exist');
        } catch (\PDOException $p) {
            $this->slim->log->error('BAD THINGS');
            return $this->slim->error();
        }
    
        return $this;
    }
    

    以及Slim的自定义错误处理.

    $app->error(function(\Exception $e) use ($app) {
        if ($e instanceof \PDOException) {
            return $app->render('500.twig', array(), 500);
        }
    });
    

    2023-02-10 13:54 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有