Я пытаюсь обернуть голову вокруг порядка операций, связанных с исключениями, брошенными в приложение для платформы Slim и окончательной доставкой страницы. В принципе, если я выброшу исключение в классе, я бы хотел, чтобы 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.");
его через $this-slim->log->error("Unable to connect to database.");
Любая помощь или руководство будут высоко оценены.
Вы столкнулись с печалью, потому что обработка ошибок Slim не была настроена, потому что ваше приложение никогда не делает это полностью до \Slim\Slim::run()
.
Две вещи:
1) Я рекомендую добавить свой класс базы данных (и другие подобные классы) в контейнер для инъекций Slim's Dependency Injection .
$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); } });