我们已经在AppController的initialize函数中声明了以下行,以使全局显示日期的格式相同:
// 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'
]
],
是否有办法始终以正确的格式全局解析Date以保存实体和验证。
答案 0 :(得分:4)
解析(在编组过程中)和验证彼此无关,前者将在之后发生 。
检查date
验证方法API,它需要进一步的参数,即要使用的格式,以及要使用的自定义正则表达式而不是预定义的表达式。
date(string|DateTime $check, string|array $format 'ymd', string|null $regex null)
日期验证,确定传递的字符串是否为有效日期。按键 预计完整的月,日和年将验证闰年。
年份有效期为1800至2999年。
格式:
dmy
27-12-2006或27-12-06分隔符可以是一个空格,句号, 破折号,正斜杠mdy
12-27-2006或12-27-06分隔符可以是a 空间,句号,短划线,正斜杠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'
])
*用于说明目的的未经测试的示例代码