Intereting Posts
Как удалить конечные нули после третьего десятичного знака в PHP? Импортировать CSV, исключить первую строку Расчет / оптимизация битрейта FFMPEG как узнать, существует ли файл в текущем дереве каталогов Корневой путь исходного документа сервера в PHP Группировка записей из цикла while | PHP Как получить доступ к переменной в классе PHP, заданной другой функцией? Codeigniter Преобразование пробелов между тегами PRE через DOM-парсер Сеятель работает отлично в первый раз, но не выполняет некоторые задачи в последующих циклах в Laravel 5? PHP DOMDocument как получить элемент? Есть ли способ принудительно выполнить аутентификацию с помощью Zend_Auth? Могу ли я получить братьев и сестер с помощью DOMDocument от PHP? Контрольный список загрузки изображений PHP Почему я не могу получить свойство объекта, который я получаю из PHP? суммирование активной записи в кодеригнере

Как я могу предоставить страницу с ошибкой в ​​структуре Slim, когда исключение выбрасывается за пределы маршрута?

Я пытаюсь обернуть голову вокруг порядка операций, связанных с исключениями, брошенными в приложение для платформы 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' .

В идеале я хотел бы сделать что-то вроде:

  1. $this-slim->log->error("Unable to connect to database."); его через $this-slim->log->error("Unable to connect to database.");
  2. Остановите попытку выполнить дальнейшие действия в моем классе DB (что бы все сбой и исключить фатальное исключение)
  3. Доставьте страницу через файл шаблона 500.twig.

Любая помощь или руководство будут высоко оценены.

Вы столкнулись с печалью, потому что обработка ошибок 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); } });