doctrine和Symfony 2中的DateTime字段

joh*_*ohn 3 php mysql doctrine symfony

我是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.
Run Code Online (Sandbox Code Playgroud)

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

Catchable Fatal Error: Object of class DateTime could not be converted to string in
Run Code Online (Sandbox Code Playgroud)

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

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

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="my_date", type="datetime", nullable=false)
     * @Assert\Date()
     */
    private $myDate;
Run Code Online (Sandbox Code Playgroud)

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

$form = $this->createFormBuilder($myClass)
            ->add('myDate', 'hidden')
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Wou*_*r J 13

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

这意味着,为了呈现窗口小部件,它只使用简单的窗口小部件模板(请参阅include语句hidden_widget.html):

<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 ?> />
Run Code Online (Sandbox Code Playgroud)

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


这就是目前发生的事情.现在,让我们转到如何解决它.它尝试渲染的数据($value)实际上称为视图数据(如您所见,定义变量的位置).在当前形势下,视图数据等于表:: $可视数据属性(见->getViewData()定义).此属性由先前定义的->normToView()方法(见$viewData定义).

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

foreach ($this->config->getViewTransformers() as $transformer) {
    $value = $transformer->transform($value);
}
Run Code Online (Sandbox Code Playgroud)

因此,为了将DateTime对象转换为字符串,我们必须使用View转换器.现在,让我们来看看可用的数据转换器.我们很幸运,因为有一个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
{
Run Code Online (Sandbox Code Playgroud)

这正是我们所需要的!

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

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

// ...

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

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