【问题标题】:symfony persist datetime from json datasymfony 从 json 数据中持久化日期时间
【发布时间】:2014-05-23 06:14:33
【问题描述】:

您好,我以 JSON 格式接收数据,在我的服务器站点上,我必须通过 Doctrine 存储它们。一切都很好,但是当我收到日期时间格式数据时出现验证错误。我在控制器中的单独操作上测试了这个案例:

public function indexAction($name)
{

    $em = $this->getDoctrine()->getManager();

    $test = new Test();
    $test->setName("Test");
    //$test->setStart(new \DateTime());
    $form = $this->createForm(new TestType(), $test);

    $store = array(
        "name" => "Test",
        "start" => new \DateTime()//will be something like *2014-04-09 11:11:11'
    );

    $form->submit($store);

    if ($form->isValid()) {
        $em->persist($test);
        $em->flush();
    } else var_dump($this->getErrorMessages($form));


    return $this->render('CodeTestBundle:Default:index.html.twig', array('name' => $name));
}

var 转储是:

数组 (size=1) '开始' => 数组(大小=3) 0 => string '此值无效。' (长度=24)

  'date' => 
    array (size=3)
      'year' => 
        array (size=0)
          ...
      'month' => 
        array (size=0)
          ...
      'day' => 
        array (size=0)
          ...
  'time' => 
    array (size=2)
      'hour' => 
        array (size=0)
          ...
      'minute' => 
        array (size=0)
          ...

【问题讨论】:

    标签: php json symfony datetime


    【解决方案1】:

    你必须使用变压器:

    namespace MyProject\SMyBundle\Form\DataTransformer;
    
    use Symfony\Component\Form\DataTransformerInterface;
    use Symfony\Component\Form\Exception\TransformationFailedException;
    
    class StringToDateTimeTransformer implements DataTransformerInterface
    {
    
    public function reverseTransform($string)
    {
    
        if (!$string) {
            return new \DateTime("now");
        }
        $date = new \DateTime((string)$string['date']);
        return $date;
    }
    
    public function transform($date)
    {
        if (!$date) {
            return null;
        }
    
        $string = date_parse (  date_format($date, "Y-m-d H:i:s"));
        if (!$string) {
            throw new TransformationFailedException(sprintf(
                'Cant transform date to string!',
                $date
            ));
        }
        return $string;
    }
    }
    

    并添加这样的字段:

    $sToDTTranformer  = new DatetimeToStringTransformer();
        $builder->add('datetime', 'text')
            ->addViewTransformer($sToDTTranformer);
    

    更多信息:http://symfony.com/en/doc/current/cookbook/form/data_transformers.html

    【讨论】:

      【解决方案2】:

      您的问题是表单框架希望每个日期和时间组件的视图数据由一个小部件处理,因为日期时间字段类型的默认小部件设置是选择。

      如果您将日期时间字段配置为单个文本输入,您的验证器将接收一个字符串而不是数组结构,并按照您的预期对其进行处理,而无需进行任何额外的转换。在您的情况下,字段配置如下所示:

      $builder->add('start', 'datetime', array(
          'widget' => 'single_text',
          'input' => 'datetime'
      ));
      

      【讨论】:

        【解决方案3】:

        嗯,你应该改用 handleRequest :

        public function indexAction($name, Request $request) // Add the Request
        {
        
            $em = $this->getDoctrine()->getManager();
        
            $test = new Test();
            $test->setName("Test");
            //$test->setStart(new \DateTime());
            $form = $this->createForm(new TestType(), $test);
        
            $store = array(
                "name" => "Test",
                "start" => new \DateTime()//will be something like *2014-04-09 11:11:11'
            );
        
            // $form->submit($store);
            $form->handleRequest($request);
        
            if ($form->isValid()) {
                $em->persist($test);
                $em->flush();
            } else var_dump($this->getErrorMessages($form));
        
        
            return $this->render('CodeTestBundle:Default:index.html.twig', array('name' => $name));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-14
          • 2014-05-04
          • 1970-01-01
          • 2010-12-31
          • 1970-01-01
          • 2011-08-04
          • 1970-01-01
          相关资源
          最近更新 更多