带有后期变量的子请求

时间:2014-08-29 14:11:22

标签: php rest symfony fosrestbundle

以下是大局:我正在为我的网络应用程序编写一个symfony2软件包。此应用程序包含一个带有CRUD控制器的标准网站。另一方面,它包含一个rest api,它还管理实体上的创建/编辑/ ....

我开始为Rest\UserController实体编写User。它包含所有标准REST操作(GET,POST,PUT,DELETE)。它基于William Durand的非常好的教程:http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/

创建并运行后,我创建了另一个UserController来处理应用程序的Web端。在这个控制器中,我有一个名为editAction的动作,它在HTML响应中呈现一个表单。提交此表单时,会向同一控制器的操作putAction发送PUT请求。我的想法是将请求转发给Rest\UserController,并采取行动putAction。以下是UserController::putAction的代码:

    /**
     * This action forwards the request to the REST controller. It redirects
     * to a user list upon success, or displays the message should an error
     * occur.
     * @Route("/{id}/put", name="igt_user_put")
     * @Method("PUT")
     */
    public function putAction (User $user)
    {
        $response = $this->forward('MyBundle:Rest\User:put', array('id'=>$user->getId()));
        if ($response->getStatusCode() == Response::HTTP_NO_CONTENT) {
            return new RedirectResponse($this->generateUrl('igt_user_list'));
        }
        return $response;
    }

这就像一个魅力,感觉它是这样做的好方法。当我认为我为用户激活/停用做同样的事情时,问题就出现了。我的lockAction中有UserController,它会通过" Rest \ UserController :: putAction`运行请求,并使用合成数据更改已启用的字段。

但我的问题是似乎无法在前向呼叫中设置POST变量(仅限路径和查询)。我甚至尝试使用带有合成请求的$ kernel-> handle($ request),但它找不到我的Rest控制器的路径。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我不确定这是否有效,但你可以尝试一下。

// Framework controller class
public function forward($controller, array $path = array(), array $query = array())
{
    $path['_controller'] = $controller;
    $subRequest = $this->container->get('request_stack')
        ->getCurrentRequest()->duplicate($query, null, $path);

    return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
}

我们可以看到它复制当前请求然后处理它。

// Request
/**
 * Clones a request and overrides some of its parameters.
 *
 * @param array $query      The GET parameters
 * @param array $request    The POST parameters
 * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
 * ...
 */
public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null)
{

因此,复制方法将采用一组post变量。所以尝试类似的事情:

public function forwardPost($controller, 
    array $path = array(), 
    array $query = array(), 
    array $post = array())
{
    $path['_controller'] = $controller;
    $subRequest = $this->container->get('request_stack')
        ->getCurrentRequest()->duplicate($query, $post, $path);

    return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
}

很想知道这是否有效。我总是将我的REST设置为一个单独的应用程序,然后使用guzzle来连接它。但转发会更快。