我有一个非常简单的表格。
我用
生成了文件bin\cake bake all [tableName]
我现在有一个可以添加/编辑/删除条目的表单。
问题是,如果我输入 1600 年 1 月 1 日之前的日期,我会收到一条错误消息,指出该日期无效。
我假设错误来自验证器。
验证规则如下:
/**
* Default validation rules.
*
* @param \Cake\Validation\Validator $validator Validator instance.
* @return \Cake\Validation\Validator
*/
public function validationDefault(Validator $validator)
{
$validator
->integer('id')
->allowEmpty('id', 'create');
$validator
->date('debut_date')
->allowEmpty('debut_date');
$validator
->date('fin_date')
->allowEmpty('fin_date');
$validator
->allowEmpty('nom');
$validator
->allowEmpty('description');
return $validator;
}
我不明白为什么会出现这个错误。你能帮帮我吗?
谢谢
最佳答案
验证不支持
看起来验证根本不允许 1600
之前的年份。
1[6-9]|[2-9]
https://github.com/cakephp/cakephp/blob/3.2.10/src/Validation/Validation.php#L404
我不确定这背后的原因,也许是为了应对某些 DBMS 的存储限制,例如 SQL Servers 1/1/1753
minimum:
What is the significance of 1/1/1753 in SQL Server?
考虑替代存储类型,甚至不同的 DBMS
鉴于您要存储 1000
之前的年份,值得一提的是,MySQL 的 DATE
类型是 supported range从 1000-01-01
开始(正如@user221931 在评论中提到的)。虽然在 1000
之前的几年似乎有非官方支持(即 0861-07-03
实际上可以存储和使用),但这可能不是您想要的依靠。
可能的解决方案在这里有点离题,并且已经在 SO 上讨论过了,比如
Does MySQL support historical date (like 1200)?
您可以使用自定义正则表达式
无论这是否应该在核心中进行更改,无论如何您都可以提供自己的正则表达式以供日期验证使用,以便接受您需要的几乎任何日期,但是您需要使用 add()
作为 date()
不支持自定义正则表达式(可能值得改进),例如
->add('fin_date', [
'rule' => ['date', null, '\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])']
])
该检查可能过于宽松,但您应该明白这一点。
您可能要开工单over at GitHub或访问 IRC或 Slack并要求核心团队澄清。我个人认为开箱即用地支持未过时/受限的 DBMS(假设这实际上是该行为的原因)是值得改进的。
关于php - 无法在 CakePHP 应用程序中存储 01/01/1600 之前的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37896735/