#cakephp
Вопрос:
Мне кажется, я что-то упускаю.
В CakePHP 4.2 была добавлена новая опция allowMultipleNulls. Значение по умолчанию равно FALSE
. Есть ли способ установить его TRUE
для всего проекта?
С помощью этой опции я, наконец, могу сохранять NULL
значения в уникальных полях без каких-либо усилий.
В настоящее время я отредактировал строку #39 cakephp/cakephp/src/ORM/Rule/IsUnique.php
и установил для нее TRUE
значение, но это смертная казнь, так как при следующем обновлении CakePHP это будет перезаписано.
Комментарии:
1. Создайте свое собственное правило, которое расширяет это и добавляет это по умолчанию, если не предусмотрено иное?
2. @GregSchmidt Я проверял правила, но я понял, что я должен установить для каждой таблицы правило — или я ошибаюсь?
3. Это верно. Я думал, что ваша проблема не в том, что вам нужно добавлять правило везде, а в том, что вы не хотели указывать
allowMultipleNulls
его каждый раз, когда добавляете правило. Поэтому я имел в виду, что вы не ограничены правилами Торта, поэтому вы можете создать свое собственное правило, которое делает именно то, что вы хотите.
Ответ №1:
В настоящее время CakePHP не предлагает простого способа установки значения по умолчанию TRUE
. Я открыл новый выпуск по этому поводу, и теперь они обсуждают некоторые принципиальные вопросы и то, как это реализовать самым сложным образом.
Моя точка зрения заключается в том, что каждый базовый компонент базы данных принимает NULL
уникальный индекс, но CakePHP выпекает здесь что-то совершенно странное и другое.
В CakePHP 4.x он был удален, а в CakePHP 4.2 он был снова введен, но по умолчанию FALSE
.
Однако, поскольку может пройти целая вечность, пока они не реализуют очень простой метод установки значения по умолчанию TRUE
, я использую приведенные ниже несколько строк кода. Дело в том, что следующее обновление CakePHP переопределяет мои изменения в их исходном коде, и это нарушает мой проект.
Поэтому я каждый раз проверяю app_local.php
текущее значение по умолчанию allowMultipleNulls
, а когда это не TRUE
так, проект умирает с уведомлением. Ответственный разработчик не запускает обновление в рабочее время и не проверяет сайт после обновления, поэтому это решение работает для меня очень надежно, не беспокоя пользователей. Я могу смириться с очень небольшой задержкой, которая требует выполнения кода.
$voidIsUnique = new CakeORMRuleIsUnique( [], [] );
$isUnique = new ReflectionClass(CakeORMRuleIsUnique::class);
$property = $isUnique->getProperty("_options");
$property->setAccessible(TRUE);
if ( !$property->getValue($voidIsUnique) ["allowMultipleNulls"] ) {
die('<span style="background-color: black; color: yellow; font-size: 36px;">' .
'IsUnique::_options ["allowMultipleNulls"] is FALSE. Fix the source code!</span>');
}
$property->setAccessible(FALSE);
Как только команда CakePHP что-то внедрит, я обновлю это здесь.
Комментарии:
1. умереть () — худшая из возможных идей. Создание исключения гарантирует, что оно будет зарегистрировано (в журналах) и не покажет эту информацию пользователям страницы.
2. @марк Нет, это не так. Я объяснил, почему. Это на 100% идеально подходит для данного случая.