Логическое значение, считываемое как строка в конфигурации CakePHP 4

#php #cakephp #php-7 #cakephp-4.x

#php #cakephp #php-7 #cakephp-4.x

Вопрос:

В настоящее время я обновляю свой проект с CakePHP 3 до CakePHP 4. Очень раздражающая проблема, с которой я сталкиваюсь, заключается в том, что 'debug' значение, хранящееся в конфигурации, считывается как строка, а не как логическое значение. Это вызывает ошибку непосредственно во внутренних классах CakePHP.

Это соответствующая часть config/app.php :

 <?php
return [
    /**
     * Debug Level:
     *
     * Production Mode:
     * false: No error messages, errors, or warnings shown.
     *
     * Development Mode:
     * true: Errors and warnings shown.
     */
    'debug' => filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),

...
 

В моем .env файле у меня есть это:

 DEBUG=true
 

При использовании с filter_var ним вычисляется логическое значение true , и поэтому его следует сохранить в моем конфигурационном массиве.

Это ошибка, которую я получаю:

 Argument 2 passed to CakeErrorErrorHandler::_displayError() must be of the type boolean, string given, called in /www-data/rebe001/hcms-sme-apps-com-cake4-cake/public/vendor/cakephp/cakephp/src/Error/BaseErrorHandler.php on line 188
 

Я взглянул на BaseErrorHandler::handleError метод, и он действительно считывает конфигурацию для поиска значения 'debug' ключа.
И это значение представляет собой строку со значением '1' .

Я также ввел dd() значение в свой AppController::initialize метод, а также там значение '1' .

Я также попытался отредактировать app.php конфигурационный файл, жестко кодирующий true значение:

 <?php
return [
    /**
     * Debug Level:
     *
     * Production Mode:
     * false: No error messages, errors, or warnings shown.
     *
     * Development Mode:
     * true: Errors and warnings shown.
     */
    //'debug' => filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),
    'debug' => true,

...
 

но результат не меняется. Я все еще получаю ошибку. Итак, проблема не в моем .env файле или в том, как считывается значение.
Я думаю, что проблема заключается в том, как значение хранится во внутреннем конфигурационном массиве CakePHP или, возможно, в способе его извлечения.

Единственный способ, который я нашел для решения проблемы, — это принудительно ввести значение в логическое true AppController::initialize значение, но, конечно, я хочу избежать этого. Добавление этой строки решает проблему, так что я могу продолжить отладку, но я, очевидно, не хочу использовать это как постоянное решение.

 Configure::write('debug', true);
 

Кто-нибудь еще сталкивался (и, надеюсь, решил) с этим?

Комментарии:

1. Это не что-то внутреннее для Cake — стандартный загрузчик PhpConfig, по сути, просто выполняет include "app.php" как есть. Если это все еще происходит с 'debug' => true, вашими файлами env, это не ваши env-файлы; в какой-то момент вы загружаете значение конфигурации, для которого оно установлено '1' . Попробуйте отладить это раньше, чем в вашем приложении — конфигурации загружаются в bootstrap.php . Если вы используете загрузочный код по умолчанию, обратите внимание, что он также загружается app_local.php . Проверяйте значение непосредственно после каждого Configure::load, чтобы убедиться, что оно установлено там правильно, и вы случайно не загружаете дополнительную информацию о конфигурации из других файлов

2. Вы на самом деле правы! После дальнейшей отладки я обнаружил, что некоторые значения в конфигурации были переписаны путем чтения некоторых значений из базы данных, и значение там было неправильным.

3. Рад, что вы его нашли 🙂

Ответ №1:

Как упоминалось в комментариях, конфигурация действительно переписывалась после того, как она была первоначально прочитана из config/app.php , и для ключа ‘debug’ было установлено не логическое значение.