Установите значение по умолчанию для allowMultipleNulls равным TRUE

#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% идеально подходит для данного случая.