CakePHP 3 – Parse Date с LocalStringFormat для исправления формата SQL и правильной проверки

мы объявили следующие строки в функции инициализации нашего AppController, чтобы они отображались в глобальном масштабе в одном и том же формате для отображения дат:

// default time formats on load Time::$defaultLocale = 'de-DE'; Time::setToStringFormat('dd.MM.YYYY'); 

Это отлично работает. Дата отображается корректно в представлении. Но мы получаем ошибку проверки, если хотим сохранить объект с полем даты (Предоставленное значение недействительно). Валидатор настроен так:

  $validator ->add('datefield', 'valid', ['rule' => 'date']) ->allowEmpty('datefield'); 

Здесь отладка объекта с полем даты:

Перед patchEntity:

 'datefield' => '08.07.2014' 

После patchEntity:

 'datefield' => object(Cake\I18n\Time) { 'time' => '2014-07-08T00:00:00+0000', 'timezone' => 'UTC', 'fixedNowTime' => false }, .... '[errors]' => [ 'datefield' => [ 'valid' => 'The provided value is invalid' ] ], 

Есть ли способ всегда анализировать дату по всему миру в правильном формате для сохранения объекта и проверки.

Разборки (в процессе сортировки) и валидация не имеют ничего общего друг с другом, первое произойдет после последнего.

Проверьте API-интерфейс проверки date , он принимает дополнительные аргументы, то есть используемый формат, и настраиваемое регулярное выражение для использования вместо предопределенных.

 date(string|DateTime $check, string|array $format 'ymd', string|null $regex null) 

Проверка даты, определяет, является ли прошедшая строка допустимой датой. ключи, которые ожидают, что полный месяц, день и год подтвердят високосные годы.

Годы действительны с 1800 до 2999.

Форматы:

  • dmy 27-12-2006 или 27-12-06 разделители могут быть пробелом, периодом, тире, косой чертой
  • mdy или 12-27-06 разделители могут быть пространством, периодом, тире, косой чертой
  • ymd 2006-12-27 или 06-12-27 разделители могут быть пространством, периодом, тире, косой чертой

[…]

API> \ Cake \ Validation \ Validation :: date ()

Поэтому, чтобы правильно проверить ваши локализованные немецкие данные, вам нужно указать формат dmy .

 ->add('datefield', 'valid', ['rule' => ['date', 'dmy']]) 

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

 namespace App\Validation; use Cake\Core\Configure; use Cake\Validation\Validation; class AppValidation { public static function date($check) { return Validation::date($check, Configure::read('Locale.validation.dateFormat')); } } 
 $validator->provider('appValidation', 'App\Validation\AppValidation'); $validator->add('datefield', 'valid', [ 'rule' => 'date', 'provider' => 'appValidation' ]) 

* непроверенный пример кода для иллюстративных целей

См. Также Cookbook> Validation> Custom Validation Rules