php doctrine datetime,php – doctrine和Symfony 2中的DateTime字段

我对Symfony2很新,并设置了一个表单,通过doctrine将日期时间数据输入MySQL数据库,但是我收到以下错误:

The form's view data is expected to be of type scalar, array or an instance of \ArrayAccess, but is an instance of class DateTime. You can avoid this error by setting the "data_class" option to "DateTime" or by adding a view transformer that transforms an instance of class DateTime to scalar, array or an instance of \ArrayAccess.

当我尝试该字段的建议数组(‘data_class’=>’dateTime’)设置但我在缓存的树枝模板中得到以下内容:

Catchable Fatal Error: Object of class DateTime could not be converted to string in

我已经尝试了一些方法来使这个工作,但似乎没有任何工作!

在我的实体中,它被声明如下:

/**

* @var \DateTime

*

* @ORM\Column(name="my_date", type="datetime", nullable=false)

* @Assert\Date()

*/

private $myDate;

并作为我的形式中的隐藏字段:

$form = $this->createFormBuilder($myClass)

->add('myDate', 'hidden')

隐藏它的原因是因为这些值是通过javascript多级表单添加的.任何人都可以对这个问题有什么看法,或者我是如何解决它的?我应该将实体设置更改为“字符串”吗?

谢谢.

解决方法:

隐藏文件类型只是一个隐藏的文本字段.

block($form, 'widget_attributes') ?><?php if (!empty($value) || is_numeric($value)): ?> value="<?php echo $view->escape($value) ?>"<?php endif ?> />

你可以看到它只是回显你传递给字段的值(转义函数不对任何重要的东西).有一个问题:您将DateTime类作为值传递,而不是字符串.即使您指定传递了DateTime类,它仍然没有更改该值,它只是尝试将DateTime对象转换为字符串.

那是不可能的.

这就是目前发生的事情.现在,让我们转到如何解决它.它尝试渲染的数据($value)实际上称为视图数据(如您所见,其中the variable is defined).在当前情况下,视图数据等于Form :: $viewData属性(参见the ->getViewData() definition).此属性先前由 – > normToView()方法定义(参见the $viewData definition).

正如您在->normToView() method中所看到的,它运行视图变换器(如果可用):

foreach ($this->config->getViewTransformers() as $transformer) {

$value = $transformer->transform($value);

}

因此,为了将DateTime对象转换为字符串,我们必须使用View转换器.现在,让我们来看看data transformers的可用性.我们非常幸运,因为有一个DateTimeToStringTransformer:

/**

* Transforms between a date string and a DateTime object

*

* @author Bernhard Schussek

* @author Florian Eckerstorfer

*/

class DateTimeToStringTransformer extends BaseDateTimeTransformer

{

这正是我们所需要的!

现在,让我们将此数据转换器注册为隐藏字段的视图转换器:

use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer;

// ...

$builder = $this->createFormBuilder($myClass);

$builder->add(

$builder->create('myDate', 'hidden')

->addViewTransformer(new DateTimeToStringTransformer())

);

完成此操作后,应正确生成表单.因为,表单中的几乎所有内容都是对称的,变换器也可以从字符串到日期时间工作,这意味着您的代码只使用DateTime对象!

标签:php,mysql,doctrine,symfony

来源: https://codeday.me/bug/20190715/1467443.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值