Обработка исключений в Slim Framework DB

Я обновляю до Slim V3. Как мне использовать соединение с базой данных? Я думаю о сервисе, введенном с прыщом:

DBConnection

final class DBConnection {

    private $db;

    public function __construct() {
        try {
            // Code to open up a DB connection in $db var...
        } catch (Exception $ex) {
            // TODO $app->error ?
        }
    }

    public function getDB() {
        return $this->db;
    }

}

index.php

$container = new \Slim\Container;

$container['db'] = function($container) {
    $connection = new DBConnection();
    return $connection->getDB();
};

Что, если соединение БД вызовет исключение PDO (или общее)? В v2 у меня было что-то вроде

$app->error

что теперь? Я также определил собственный errorHandler, как я могу как-то "перенаправить" управление этим маршрутом?

1 ответ

Обработка ошибок в Slim 3 очень проста, как объяснено в документации.

Поскольку вы определяете свои контейнерные сервисы перед созданием Slim\Appопределите обработчик ошибок следующим образом (в index.php):

$container['errorHandler'] = function($container) {
    return function ($request, $response, $exception) use ($container) {
        return $container['response']->withStatus(500)
                                     ->withHeader('Content-Type', 'text/html')
                                     ->write($exception->getMessage());
    };
};

Все исключения будут перехвачены определенным обработчиком, если:

  • исключение не было перехвачено ранее (как в вашем примере кода)
  • исключение не является одним из них:
    • Slim\Exception\MethodNotAllowedException
    • Slim\Exception\NotFoundException
    • Slim\Exception\SlimException

Для первых двух вы также можете определить свои собственные обработчики.

Итак, вернемся к вашему примеру:

final class DBConnection {

    private $db;

    public function __construct() {
        // Code to open up a DB connection in $db var...
        // Don't have to catch here
    }

    public function getDB() {
        return $this->db;
    }
}
Другие вопросы по тегам