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

CakePHP 3-使用LocalStringFormat解析日期以更正SQL格式和验证,php,mysql,validation,cakephp,Php,Mysql,Validation,Cakephp,我们已在AppController的initialize函数中声明以下行具有全局相同的日期显示格式: // default time formats on load Time::$defaultLocale = 'de-DE'; Time::setToStringFormat('dd.MM.YYYY'); 这很有效。该日期在视图中正确显示。但若我们想用日期字段保存实体,我们会得到一个验证错误。提供的值无效。验证程序的配置如下: $validator

我们已在AppController的initialize函数中声明以下行具有全局相同的日期显示格式:

    // default time formats on load
    Time::$defaultLocale = 'de-DE';
    Time::setToStringFormat('dd.MM.YYYY');
这很有效。该日期在视图中正确显示。但若我们想用日期字段保存实体,我们会得到一个验证错误。提供的值无效。验证程序的配置如下:

    $validator
        ->add('datefield', 'valid', ['rule' => 'date'])
        ->allowEmpty('datefield');
这里是带有日期字段的实体调试:

在更新实体之前:

'datefield' => '08.07.2014'
'datefield' => object(Cake\I18n\Time) {

        'time' => '2014-07-08T00:00:00+0000',
        'timezone' => 'UTC',
        'fixedNowTime' => false

    },
....
'[errors]' => [
        'datefield' => [
            'valid' => 'The provided value is invalid'
        ]
    ],
在实体之后:

'datefield' => '08.07.2014'
'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,它需要进一步的参数,即要使用的格式,以及要使用的自定义正则表达式,而不是预定义的正则表达式

日期验证,确定传递的字符串是否为有效日期。钥匙 预计整个月、日和年将验证闰年

有效期从1800年到2999年

格式: dmy 27-12-2006或27-12-06分离器可以是空间、周期、, 前斜杠 mdy 12-27-2006或12-27-06分离器可以是 空格、句点、破折号、正斜杠 ymd 2006-12-27或06-12-27 分隔符可以是空格、句点、破折号、正斜杠 ... [……]

因此,为了正确验证本地化的德语数据,您必须指定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'));
    }
}
*用于说明目的的未测试示例代码


另请参见编组过程中的解析和验证互不相关,前者将在后者之后发生

检查日期验证方法API,它需要进一步的参数,即要使用的格式,以及要使用的自定义正则表达式,而不是预定义的正则表达式

日期验证,确定传递的字符串是否为有效日期。钥匙 预计整个月、日和年将验证闰年

有效期从1800年到2999年

格式: dmy 27-12-2006或27-12-06分离器可以是空间、周期、, 前斜杠 mdy 12-27-2006或12-27-06分离器可以是 空格、句点、破折号、正斜杠 ymd 2006-12-27或06-12-27 分隔符可以是空格、句点、破折号、正斜杠 ... [……]

因此,为了正确验证本地化的德语数据,您必须指定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'));
    }
}
*用于说明目的的未测试示例代码


另请参见

Ok听起来不错。但是没有办法将验证器规则始终添加到DateTime字段,对吗?我只是想避免一些错误,比如有人在烘焙新模型时忘记添加验证器规则example@StephanHofmann是的,有,但这有它自己的陷阱,这是一个不同的问题。例如,您可以检查模型模式,并在中自动向验证器添加日期/时间验证规则。但当开发人员添加他们自己的日期字段验证时,事情仍然可能会破裂。但我认为将验证器添加到每个日期字段是很好的。它与dmy合作得很好。谢谢好的,听起来不错。但是没有办法将验证器规则始终添加到DateTime字段,对吗?我只是想避免一些错误,比如有人在烘焙新模型时忘记添加验证器规则example@StephanHofmann是的,有,但这有它自己的陷阱,这是一个不同的问题。例如,您可以检查模型模式,并在中自动向验证器添加日期/时间验证规则。但当开发人员添加他们自己的日期字段验证时,事情仍然可能会破裂。但我认为将验证器添加到每个日期字段是很好的。它与dmy合作得很好。非常感谢。