如何从Symfony2中的PUT请求获取参数?

时间:2014-01-22 06:11:55

标签: php symfony symfony-2.3

我正在使用Symfony 2.3,我有一个看起来像这样的方法:

public function addAction() {

    $user = new User();
    $form = $this->createForm(new UserType(), $user);
    $form->handleRequest($this->getRequest());

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($user);
        $em->flush();

        try {
            return $this
                    ->render(
                            'SomeBundle:Default:adduser.html.twig',
                            array('id' => $user->getId()));
        } catch (Exception $e) {
            throw new HttpException(500, "Error persisting");
        }
    }

    throw new HttpException(400, "Invalid request");
}

用这条路线:

some_bundle_adduserpage:
pattern: /user
defaults: { _controller: SomeBundle:User:add }
methods: [POST]

它工作得很好。我也有这种方法:

public function editAction($id) {

    $response = new Response();

    if (!$this->doesUserExist($id)) {
        $response->setStatusCode(400);
        return $response;
    }

    $user = new User();
    $form = $this->createForm(new UserType(), $user);
    $form->handleRequest($this->getRequest());

    if (!$form->isValid()) {
        $response->setStatusCode(400);
        return $response;
    }

    $user->setId($id);
    $em = $this->getDoctrine()->getManager();

    try {
        $em->persist($user);
        $em->flush();

        $response->setStatusCode(200);
    } catch (Exception $e) {
        $response->setStatusCode(500);
    }

    return $response;
}

用这条路线:

some_bundle_edituserpage:
pattern: /user/{id}
defaults: { _controller: SomeBundle:User:edit }
methods: [PUT]
requirements:
    id: \d+

它不起作用。我可以制定一些请求并POST就好了,但PUT不起作用。具体来说,看起来我没有在$this->getRequest()内获得任何参数。为什么$this->getRequest()似乎适用于POST,而不是PUT?我做错了什么?

2 个答案:

答案 0 :(得分:1)

这就是诀窍:

$form = $this ->createForm(new UserType(), $user, array('method' => 'PUT'));

method位丢失了。显然,Symfony还不够酷,无法为您获取参数。创建表单时,您必须手动告诉它正在处理的请求类型。虽然这有效,但我不确定这是最好的答案。我非常愿意听别人。

答案 1 :(得分:0)

PUT方法直接流式传输到stdin,因此要访问它,您应使用php://inputfopen read

$put = fopen("php://input", "r");

免责声明在Symfony中可能有一个内置的方法,但我已经忘记了。