【问题标题】:symfony form invalid datetime field sended by apiapi发送的symfony表单无效的日期时间字段
【发布时间】:2018-03-22 23:08:39
【问题描述】:

我正在使用 api (Angular/Symfony) 并尝试提交我的表单,但表单总是显示此值对于实体的日期或日期时间字段无效。即使我在没有更改的情况下发回相同的日期。

动作

/**
     * @Rest\Route("/editar/{slug}")
     * @Rest\View()
     */
    public function editarEmbarque(Request $request, $slug)
    {
        $embarque = $this->getDoctrine()->getRepository('AppBundle:Embarque')->findOneBySlug(trim($slug));
        $response = [];

        if ($embarque) {
            $body = $request->getContent();
            $data = json_decode($body, true);

            $form = $this->createForm('AppBundle\Form\EmbarqueType', $embarque);
            $form->submit($data);

            if ($form->isValid()) {
                $em = $this->get('doctrine.orm.entity_manager');

                $em->persist($embarque);
                $em->flush();
                return ['status' => 'si'];
            }

            return ['status' => 'no'];
        }
        return ['status' => '404'];
    }

实体有许多日期时间字段作为表单。

这是我对错误来源和消息进行转储时的响应

string(20) "entregaFacturacionAt"
string(24) "This value is not valid."
{"status":"no"}

数据也没有问题

array(11) {
  ["bl"]=>
  string(5) "mi bl"
  ["manifiesto"]=>
  string(24) "mi otro manifiesto kkk"
  ["facturaProveedor"]=>
  array(0) {
  }
  ["embarqueContenedores"]=>
  array(0) {
  }
  ["habilitadoMariel"]=>
  bool(false)
  ["liberadoBlHouse"]=>
  bool(false)
  ["liberadoBlMaster"]=>
  bool(false)
  ["slug"]=>
  string(30) "mi-bl-mi-otro-manifiesto-kkk"
  ["createdAt"]=>
  string(25) "2018-03-22T08:27:37-04:00"
  ["updatedAt"]=>
  string(25) "2018-03-22T17:41:11-04:00" //this is a date unchanged
  ["entregaFacturacionAt"]=>
  string(10) "2018-03-24" // this is a date changed
}

我忘记了一些事情,我使用了数据转换器但没有结果。有什么想法吗?

提前致谢。

编辑:表格示例

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('regular_no_date_fields') // <= it could be text,string,number,array... it works
            ->add('blAt', DateType::class);                                             

    }

编辑:发布数据

{
    "bl":"mi bl",
    "blAt": "Fri Mar 30 2018", <= this is one of the formats, i tried also with m-d-y y-m-d or changing - for /
    "manifiesto":"mi manifiesto",
    "pais":"China",
    "puertoOrigen":"Tsing ao",
    "puertoDestino": "Mariel",
    "embarqueContenedores":[]
}

有趣的是,当我将数据直接设置为实体并使用 de 验证器时,一切正常。例如,上面的帖子数据运行良好。

【问题讨论】:

  • 向我们展示您的表单和验证配置。
  • 表单是由教条生成的:generate:form 命令,在日期/日期时间字段上只有特定的更改,在我指定的 DateType 类中
  • 我遇到了同样的问题。我在调用 symfony api 之前通过转换为 iso 来解决它。 console.log(new Date('2018-03-24').toISOString());
  • @Harold 也尝试使用 toLocaleString、toLocaleDateString 等但不起作用

标签: angular symfony datetime doctrine-orm symfony-forms


【解决方案1】:

尝试像这样声明您的 DateType:

$builder
  ->add('yourDateField', DateType::class, array(
            'input' => 'string', //depends on format of underlying object
            'widget' => 'single_text'
        ))

【讨论】:

  • 仍然获取此值在日期/日期时间字段中无效
  • 你能发布底层对象的实体吗?
【解决方案2】:

我在使用 AngularJs 和 Symfony 时发现了这个问题。您应该像这样向您发送日期类型。

{"日期":"2018-03-22T23:00:00.000Z"}

从后端:

$builder->add('date', 'datetime', ['widget' => 'single_text']);

【讨论】:

  • 我正在使用 symfony 2.6 这就是为什么这种类型有效。顺便说一句,不客气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多