我试图围绕处理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模板文件传递页面.
任何帮助或方向将不胜感激.
你正在陷入悲痛之中,因为还没有配置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); } });