#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’ было установлено не логическое значение.