Symfony services.yaml обрабатывает исключение - PullRequest
0 голосов
/ 09 октября 2019

В моем services.yaml у меня есть этот код:

services:
    # prepare database
    DatabaseProvider:
        class: Kepler\Providers\DatabaseProvider
        arguments: ['%database.reader.dsn%', '%database.reader.username%', '%database.reader.password%']

    ReaderPDO:
        class: PDO
        factory: ['@DatabaseProvider', generateDatabaseConnection]

    WriterPDO:
        class: PDO
        factory: ['@DatabaseProvider', generateDatabaseConnection]

и DatabaseProvider: generateDatabaseConnection

public function generateDatabaseConnection() {
        try {
            return new PDO($this->host, $this->username, $this->password);
        } catch (Exception $e) {
            return new PDO($this->host, $this->username, $this->password);
            $_GLOBALS['db_error'] = true;
        }
    }

Так что мой вопрос здесь: будут случаи, когдаPDO-соединение не работает / не работает. Итак, как мне перехватить это исключение и вернуть общую страницу 404 (это страница, на которой мне не нужно соединение с БД)?

Некоторый базовый анализ:

  • Я верю в этопроисходит сбой во время загрузки Symfony
  • Даже если я верну null или ничего не получу в перехватчике, код будет продолжать autowiring , который затем завершится ошибкой в ​​контроллере, который требует подключения к БД

1 Ответ

1 голос
/ 09 октября 2019

наличие return в блоке catch должно считаться вредным, если точно такое же , что и в блоке try.

Установка глобальногоценность действительно старая школа и не совсем способ Symfony. Вместо этого вы бы сгенерировали конкретное исключение (или просто не перехватили одно PDO) и добавили слушатель события для исключения ядра , которое будет результатом этого, где вы можете искать это конкретное исключение и возвращатьправильная страница ошибки, которую вы хотите.

Если вы просто хотите страницу 404, вы можете выбросить NotFoundHttpException или, что более удобно, ServiceUnavailableException ...

...