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 * * @ORMColumn(name="my_date",type="datetime",nullable=false) * @AssertDate() */ private $myDate; 并作为我的形式中的隐藏字段: $form = $this->createFormBuilder($myClass) ->add('myDate','hidden') 隐藏它的原因是因为这些值是通过javascript多级表单添加的.任何人都可以对这个问题有什么看法,或者我是如何解决它的?我应该将实体设置更改为“字符串”吗? 谢谢. 解决方法
隐藏文件类型只是一个隐藏的文本字段.
这意味着,为了呈现窗口小部件,它只使用simple widget template(请参阅 <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)实际上称为视图数据(如您所见,其中the variable is defined).在当前情况下,视图数据等于Form :: $viewData属性(参见the 正如您在 foreach ($this->config->getViewTransformers() as $transformer) { $value = $transformer->transform($value); } 因此,为了将DateTime对象转换为字符串,我们必须使用View转换器.现在,让我们来看看data transformers的可用性.我们非常幸运,因为有一个 /** * 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 { 这正是我们所需要的! 现在,让我们将此数据转换器注册为隐藏字段的视图转换器: use SymfonyComponentFormExtensionCoreDataTransformerDateTimeToStringTransformer; // ... $builder = $this->createFormBuilder($myClass); $builder->add( $builder->create('myDate','hidden') ->addViewTransformer(new DateTimeToStringTransformer()) ); 完成此操作后,应正确生成表单.因为,表单中的几乎所有内容都是对称的,变换器也可以从字符串到日期时间工作,这意味着您的代码只使用DateTime对象! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |