如何为 doctrine Date 水化器添加自定义水化器策略
How to add a custom hydrator strategy for doctrine Date hydrator
我有一个表单,其中包含 3 个文本类型的字段和一个日期验证器。
此代码位于使用 doctrine hydrator(与 doctrine 实体相关)的字段集中
$this->add(
array(
'name' => 'endDate',
'type' => 'Zend\Form\Element\Text',
'options' => array(
'label' => 'end_date_label',
'label_attributes' => array(
'class' => 'control-label col-xs-3'
),
),
'attributes' => array(
'class' => 'form-control col-xs-3 datepicker-end-date',
)
)
);
'endDate' => array(
'required' => true,
'allow_empty' => false,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'Date',
'options' => array(
'format' => 'd/m/Y',
),
),
),
),
我使用法语日期格式。当我将格式更改为 m/d/Y 时,当我验证表单时,它正在工作,但是当我的表单无效时,我的日期选择器得到错误的日期(月份和日期颠倒)。
我想要的是验证法国日期格式,并以 m/d/Y 格式将日期保存到数据库中。
使用这种格式我得到错误:
DateTime::__construct(): Failed to parse time string (29/04/2015) at position 0 (2): Unexpected character
我在 Stack 上看到很多 post 谈论自定义水化教义策略,但我不明白。我应该逐步做什么?
我试图为我的字段 endDate 添加一个策略,但它从未被调用...此代码位于字段集中 class,就在我的字段声明之前:
$this->setHydrator(new DoctrineHydrator($this->getObjectManager(), 'TodoList\Entity\TodoQuestion'))
->setObject(new TodoQuestion());
$this->getHydrator()->addStrategy('endDate', new \Application\Strategy\DateTimeStrategy());
我的日期时间策略实现了策略接口。
<?php
namespace Application\Strategy;
use Zend\Stdlib\Hydrator\Strategy\StrategyInterface;
class DateTimeStrategy implements StrategyInterface
{
public function hydrate($value)
{
if (is_string($value)) {
$value = new DateTime($value);
}
return $value->format('d/m/Y');
}
public function extract($value)
{
return;
}
}
如果有人能详细解释我做错了什么并帮助我理解这整件事..
您应该 return 策略中的 DateTime 对象。
namespace Application\Strategy;
use Zend\Stdlib\Hydrator\Strategy\StrategyInterface;
class DateTimeStrategy implements StrategyInterface
{
public function hydrate($value)
{
if (is_string($value)) {
$value = \DateTime::createFormFormat('d/m/Y', $value);
}
return $value;
}
public function extract($value)
{
return $value;
}
}
上面的方法是行不通的,因为策略是在水化器的类型转换之后调用的。
最好使用回调过滤器。
'endDate' => array(
'required' => true,
'allow_empty' => false,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
array(
'name' => 'Callback',
'options' => array(
'callback' => function($value) {
if (is_string($value)) {
$value = \DateTime::createFromFormat('d/m/Y', $value);
}
return $value;
},
),
),
'validators' => array(
array(
'name' => 'Date',
'options' => array(
'format' => 'd/m/Y',
),
),
),
),
顺便说一句,您使用的理论保湿器似乎已经过时了。当前版本不需要将实体指定为第二个参数。
偶然发现这个问题。虽然它相当老了,但我最近在使用 ZF2 格式的日期。我已经按照下面的方式完成了格式设置,没有使用回调。
也许将来会对某人有所帮助 ;)
以下是使用 ZF2 2.5.3
完成的
$this->add([
'name' => 'startDate',
'required' => true,
'filters' => [
[
'name' => DateTimeFormatter::class,
'options' => [
'format' => 'Y-m-d', // or d/m/Y
],
],
],
'validators' => [
[
'name' => Date::class,
'options' => [
'format' => 'Y-m-d', // or d/m/Y
],
],
],
]);
我有一个表单,其中包含 3 个文本类型的字段和一个日期验证器。
此代码位于使用 doctrine hydrator(与 doctrine 实体相关)的字段集中
$this->add(
array(
'name' => 'endDate',
'type' => 'Zend\Form\Element\Text',
'options' => array(
'label' => 'end_date_label',
'label_attributes' => array(
'class' => 'control-label col-xs-3'
),
),
'attributes' => array(
'class' => 'form-control col-xs-3 datepicker-end-date',
)
)
);
'endDate' => array(
'required' => true,
'allow_empty' => false,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'Date',
'options' => array(
'format' => 'd/m/Y',
),
),
),
),
我使用法语日期格式。当我将格式更改为 m/d/Y 时,当我验证表单时,它正在工作,但是当我的表单无效时,我的日期选择器得到错误的日期(月份和日期颠倒)。
我想要的是验证法国日期格式,并以 m/d/Y 格式将日期保存到数据库中。
使用这种格式我得到错误:
DateTime::__construct(): Failed to parse time string (29/04/2015) at position 0 (2): Unexpected character
我在 Stack 上看到很多 post 谈论自定义水化教义策略,但我不明白。我应该逐步做什么?
我试图为我的字段 endDate 添加一个策略,但它从未被调用...此代码位于字段集中 class,就在我的字段声明之前:
$this->setHydrator(new DoctrineHydrator($this->getObjectManager(), 'TodoList\Entity\TodoQuestion'))
->setObject(new TodoQuestion());
$this->getHydrator()->addStrategy('endDate', new \Application\Strategy\DateTimeStrategy());
我的日期时间策略实现了策略接口。
<?php
namespace Application\Strategy;
use Zend\Stdlib\Hydrator\Strategy\StrategyInterface;
class DateTimeStrategy implements StrategyInterface
{
public function hydrate($value)
{
if (is_string($value)) {
$value = new DateTime($value);
}
return $value->format('d/m/Y');
}
public function extract($value)
{
return;
}
}
如果有人能详细解释我做错了什么并帮助我理解这整件事..
您应该 return 策略中的 DateTime 对象。
namespace Application\Strategy;
use Zend\Stdlib\Hydrator\Strategy\StrategyInterface;
class DateTimeStrategy implements StrategyInterface
{
public function hydrate($value)
{
if (is_string($value)) {
$value = \DateTime::createFormFormat('d/m/Y', $value);
}
return $value;
}
public function extract($value)
{
return $value;
}
}
上面的方法是行不通的,因为策略是在水化器的类型转换之后调用的。
最好使用回调过滤器。
'endDate' => array(
'required' => true,
'allow_empty' => false,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
array(
'name' => 'Callback',
'options' => array(
'callback' => function($value) {
if (is_string($value)) {
$value = \DateTime::createFromFormat('d/m/Y', $value);
}
return $value;
},
),
),
'validators' => array(
array(
'name' => 'Date',
'options' => array(
'format' => 'd/m/Y',
),
),
),
),
顺便说一句,您使用的理论保湿器似乎已经过时了。当前版本不需要将实体指定为第二个参数。
偶然发现这个问题。虽然它相当老了,但我最近在使用 ZF2 格式的日期。我已经按照下面的方式完成了格式设置,没有使用回调。
也许将来会对某人有所帮助 ;)
以下是使用 ZF2 2.5.3
完成的 $this->add([
'name' => 'startDate',
'required' => true,
'filters' => [
[
'name' => DateTimeFormatter::class,
'options' => [
'format' => 'Y-m-d', // or d/m/Y
],
],
],
'validators' => [
[
'name' => Date::class,
'options' => [
'format' => 'Y-m-d', // or d/m/Y
],
],
],
]);