Php 来自json数据的symfony persist datetime
您好,我以JSON格式接收数据,在我的服务器站点上,我必须通过条令存储它们。一切正常,但当我收到datetime格式的数据时,出现了验证错误。我在控制器中的单独操作上测试此情况:Php 来自json数据的symfony persist datetime,php,json,symfony,datetime,Php,Json,Symfony,Datetime,您好,我以JSON格式接收数据,在我的服务器站点上,我必须通过条令存储它们。一切正常,但当我收到datetime格式的数据时,出现了验证错误。我在控制器中的单独操作上测试此情况: public function indexAction($name) { $em = $this->getDoctrine()->getManager(); $test = new Test(); $test->setName("Test"); //$test-&g
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转储是:
数组(大小=1)“开始”=>
数组(大小=3)
0=>字符串“此值无效”。(长度=24)
哼,你应该用HandlerRequest代替:
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));
}
您必须使用变压器:
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);
更多信息:您的问题是表单框架希望视图数据由每个日期和时间组件的一个小部件处理,因为datetime字段类型的默认小部件设置为choice 如果将datetime字段配置为单个文本输入,那么验证器将接收一个字符串而不是数组结构,并按照预期进行处理,而无需进行任何额外的转换。在您的情况下,字段配置如下所示:
$builder->add('start', 'datetime', array(
'widget' => 'single_text',
'input' => 'datetime'
));
$builder->add('start', 'datetime', array(
'widget' => 'single_text',
'input' => 'datetime'
));