簡體   English   中英

Symfony2 FOSRestBundle時間戳驗證失敗

[英]Symfony2 FOSRestBundle timestamp validation fails

我正在嘗試向我的REST API發送包含兩個時間戳的發布請求。 問題在於時間戳記被標記為無效。 “此值無效。”

我究竟做錯了什么?

這是請求:

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}

控制器如下所示:

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);
    }
}

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';
    }
}

實體類:

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;
    }
}

輸入選項僅用於基礎數據對象的模型端。 您的情況應該是日期時間。 您的問題是,您要將時間戳轉換為symfony表單datetime表單類型可以識別的視圖數據。 不幸的是,我不知道該怎么做。

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

您可以使用變壓器來實現。 請參閱Symfony變形金剛

這是我的FormType的示例:

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

...

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

確保使用“文本”作為輸入類型,否則對我不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM