CakePHP 3 - 使用LocalStringFormat解析日期以更正SQL格式并更正验证

时间:2016-01-20 09:33:48

标签: php mysql validation cakephp

我们已经在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以保存实体和验证。

1 个答案:

答案 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'
])

*用于说明目的的未经测试的示例代码

另请参阅 Cookbook > Validation > Custom Validation Rules