简体   繁体   English

Symfony2 FOSRestBundle时间戳验证失败

[英]Symfony2 FOSRestBundle timestamp validation fails

I'm trying to send a post request including two timestamps to my REST api. 我正在尝试向我的REST API发送包含两个时间戳的发布请求。 The problem is that the timestamps are marked as invalid. 问题在于时间戳记被标记为无效。 "This value is not valid." “此值无效。”

What am I doing wrong? 我究竟做错了什么?

This is the request: 这是请求:

POST http://localhost:8000/app_test.php/api/projects/1/tasks/1/timetrackings

Accept: application/json 
Content-Type: application/json

{"timeStart":1390757625,"timeEnd":1390757625,"projectMember":1}

The Controller looks as follows: 控制器如下所示:

class MemberController extends BaseApiController implements ClassResourceInterface
{
    public function postAction($projectId, $taskId, Request $request)
    {
        /** @var EntityManager $em */
        $em = $this->getDoctrine()->getManager();
        $this->findProject($em, $projectId);
        $task = $this->findTask($em, $projectId, $taskId);

        $request->request->add(array(
            'task' => $taskId,
        ));
        $form = $this->createForm(new TimeTrackType(), new TimeTrack());
        $form->submit($request->request->all());
        if ($form->isValid())
        {
            /** @var TimeTrack $tracking */
            $tracking = $form->getData();
            $task->addTimeTrack($tracking);
            $em->flush();
            return $this->redirectView(
                $this->generateUrl('api_get_project_task_timetracking', array(
                    'projectId'  => $projectId,
                    'taskId'     => $taskId,
                    'trackingId' => $tracking->getId(),
                )),
                Codes::HTTP_CREATED
            );
        }
        return View::create($form, Codes::HTTP_BAD_REQUEST);
    }
}

The TimeTrackType class: TimeTrackType类:

namespace PMTool\ApiBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TimeTrackType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('timeStart', 'datetime', array(
                'input' => 'timestamp',
            ))
            ->add('timeEnd', 'datetime', array(
                'input' => 'timestamp',
            ))
            ->add('projectMember')
            ->add('task')
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'PMTool\ApiBundle\Entity\TimeTrack',
            'csrf_protection' => false,
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'timetrack';
    }
}

The entity class: 实体类:

namespace PMTool\ApiBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use \DateTime;

/**
 * TimeTrack
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="PMTool\ApiBundle\Entity\TimeTrackRepository")
 */
class TimeTrack
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var DateTime
     *
     * @ORM\Column(name="timeStart", type="datetime")
     */
    private $timeStart;

    /**
     * @var DateTime
     *
     * @ORM\Column(name="timeEnd", type="datetime")
     */
    private $timeEnd;


    /**
     * @var ProjectMember
     *
     * @ORM\ManyToOne(targetEntity="ProjectMember")
     */
    private $projectMember;

    /**
     * @var Task
     *
     * @ORM\ManyToOne(targetEntity="Task", inversedBy="timeTracks")
     * @ORM\JoinColumn(name="taskId", referencedColumnName="id")
     */
    private $task;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set timeStart
     *
     * @param DateTime $timeStart
     * @return TimeTrack
     */
    public function setTimeStart($timeStart)
    {
        $this->timeStart = $timeStart;

        return $this;
    }

    /**
     * Get timeStart
     *
     * @return DateTime
     */
    public function getTimeStart()
    {
        return $this->timeStart;
    }

    /**
     * Set timeEnd
     *
     * @param DateTime $timeEnd
     * @return TimeTrack
     */
    public function setTimeEnd($timeEnd)
    {
        $this->timeEnd = $timeEnd;

        return $this;
    }

    /**
     * Get timeEnd
     *
     * @return DateTime
     */
    public function getTimeEnd()
    {
        return $this->timeEnd;
    }

    /**
     * @return \PMTool\ApiBundle\Entity\Task
     */
    public function getTask()
    {
        return $this->task;
    }

    /**
     * @param \PMTool\ApiBundle\Entity\Task $task
     * @return $this
     */
    public function setTask($task)
    {
        $this->task = $task;
        return $this;
    }

    /**
     * @return \PMTool\ApiBundle\Entity\ProjectMember
     */
    public function getProjectMember()
    {
        return $this->projectMember;
    }

    /**
     * @param \PMTool\ApiBundle\Entity\ProjectMember $projectMember
     * @return $this
     */
    public function setProjectMember($projectMember)
    {
        $this->projectMember = $projectMember;
        return $this;
    }
}

the input option is just for the model side of your underlying data object. 输入选项仅用于基础数据对象的模型端。 In your case it should be datetime. 您的情况应该是日期时间。 Your problem is, that you want to transform the timestamp into view data that the symfony form datetime form type does recognise. 您的问题是,您要将时间戳转换为symfony表单datetime表单类型可以识别的视图数据。 And I dont know how to do that, unfortunately. 不幸的是,我不知道该怎么做。

http://symfony.com/doc/current/reference/forms/types/datetime.html#input http://symfony.com/doc/current/reference/forms/types/datetime.html#input

You can use a transformer to achieve this. 您可以使用变压器来实现。 ( See Symfony Transformers ) 请参阅Symfony变形金刚

Here is an Example of my FormType: 这是我的FormType的示例:

use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer;

...

$transformer = new DateTimeToTimestampTransformer();
$builder->add($builder->create('validFrom', 'text')
                ->addModelTransformer($transformer)
        )

Be sure to use "'text'" as an input type, otherwise it didn't work for me. 确保使用“文本”作为输入类型,否则对我不起作用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM