【问题标题】:Symfony 2 form validation - extending requestSymfony 2 表单验证 - 扩展请求
【发布时间】:2014-05-13 14:28:55
【问题描述】:

我正在使用 FOSRestBundle 在 Symfony 中构建一个 REST API。

在我的税务控制器中,我有:

    private function processForm(Request $request, Tax $tax )
    {

        $form = $this->createForm(new TaxType(),$tax);

        $req = $request->request->all();


        $form->submit($req['tax']);



        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($tax);
            $em->flush();
            return $this->getTaxAction($tax->getId());
        }

        return array(
            'form' => $form,
            'request' => $request->request->all()
        );
    }

从 POST 和 PUT 函数调用此函数。

税种

        class TaxType extends AbstractType
        {
                /**
             * @param FormBuilderInterface $builder
             * @param array $options
             */
            public function buildForm(FormBuilderInterface $builder, array $options)
            {
                $builder
                    ->add('createDate')
                    ->add('writeDate')
                    ->add('name')
                    ->add('amount')
                    ->add('active')
                    ->add('createUid')
                    ->add('writeUid')
                    ->add('company')
                ;
            }
    ...

到目前为止它运行良好,但现在我在表格中添加了一些额外的列(以及税务实体的属性),例如:记录所属的公司,创建日期。这不会来自客户端,而是设置在服务器端。 如何添加例如 createData?

我试过了

    $req['tax']['createDate'] = new \DateTime("now");

但我得到了:

 {"code":400,
"message":"Validation Failed",
"errors":{"children":{"createDate":{"errors":["This value is not valid."],
"children":{"date":{"children":{"year":[],"month":[],"day":[]}},
"time":{"children":{"hour":[],"minute":[]}}}},
"writeDate":{"children":{"date":{"children":{"year":[],"month":[],"day":[]}},
"time":{"children":{"hour":[],"minute":[]}}}},"name":[],"amount":[],"active":[],"createUid":[],"writeUid":[],"company":[]}}}

来自实体 Tax.php

    /**
     * @var \DateTime
     */
    private $createDate;

我猜我用正确的数据类型扩展了请求,但我得到了验证错误。

【问题讨论】:

    标签: php validation symfony


    【解决方案1】:

    如果我正确理解了这个问题,您不必接受请求,只需更改 $tax-object 上的属性即可。 如果需要,您也可以在表单验证后执行此操作。

    【讨论】:

      【解决方案2】:

      您可以从表单构建器中删除 add('createDate')

      $builder
      ->add('createDate')
      ->添加('writeDate')
      ->添加('名称')
      ->添加('数量')
      ->添加('活动')
      ->添加('createUid')
      ->添加('writeUid')
      ->添加('公司')

      然后在持久化之前在 $tex 对象上设置 createdDate 值。

      if ($form->isValid()) {
          $tax->setCreateDate(new \DateTime("now"));
          $em = $this->getDoctrine()->getManager();
          $em->persist($tax);
          $em->flush();
          return $this->getTaxAction($tax->getId());
      }
      

      替代方法

      或者您可以使用Doctrine's Lifecycle Callbacks 来实现此目的。

      编码愉快!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 2015-07-19
        • 2014-04-30
        • 1970-01-01
        相关资源
        最近更新 更多