gpt4 book ai didi

php - Doctrine 和 Symfony 2 中的 DateTime 字段

转载 作者:可可西里 更新时间:2023-11-01 07:47:11 24 4
gpt4 key购买 nike

我是 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.

当我尝试建议的 array('data_class' => 'dateTime') 字段设置时,我在缓存的 Twig 模板中得到以下内容:

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 多阶段表单添加的。任何人都可以了解问题可能是什么,或者我如何解决它吗?我应该将我的实体设置更改为“字符串”吗?

谢谢。

最佳答案

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

这意味着,为了呈现小部件,它只使用 simple widget template (参见 hidden_widget.html 中的 include 语句):

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

如您所见,它只是回显您传递给该字段的值(转义函数不会处理任何重要的事情)。问题是:您传递了一个 DateTime 类作为值,而不是字符串。即使您指定传递了一个 DateTime 类,它仍然没有更改值,它只是尝试将 DateTime 对象转换为一个字符串。这是不可能的。


这就是目前发生的事情。现在,让我们继续讨论如何修复它。它尝试呈现的数据 ($value) 实际上称为 View 数据(正如您在 the variable is defined 中看到的那样)。在当前情况下, View 数据等于 Form::$viewData 属性(参见 the ->getViewData() definition )。此属性之前由 ->normToView() 方法定义(请参阅 the $viewData definition)。

正如您在 ->normToView() method 中看到的那样,它运行 View 转换器如果可用:

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 <bschussek@gmail.com>
* @author Florian Eckerstorfer <florian@eckerstorfer.org>
*/
class DateTimeToStringTransformer extends BaseDateTimeTransformer
{

这正是我们所需要的!

现在,让我们将此数据转换器注册为 hidden 字段的 View 转换器:

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

// ...

$builder = $this->createFormBuilder($myClass);
$builder->add(
$builder->create('myDate', 'hidden')
->addViewTransformer(new DateTimeToStringTransformer())
);

完成此操作后,应该会正确生成表单。而且因为几乎所有形式的东西都是对称的,转换器也适用于从字符串到日期时间,这意味着您的代码只使用 DateTime 对象!

关于php - Doctrine 和 Symfony 2 中的 DateTime 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21791068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com