如何在请求的操作以外的函数中返回/终止symfony2响应?

时间:2015-05-29 21:07:52

标签: php symfony fosrestbundle

我正在使用Symfony2,FOSRestBundle和OAuth 2服务器库构建RESTful API。

对于任何给定的请求,我可以将许多可能的回复和状态代码返回给客户。

以获取用户的过程为例:

<?php

class UserController extends CustomBaseController {


    /**
     * Get a user
     * @Get("/users", name="users_get")
     */
    public function getAction(Request $request) {

        // Ensure a valid access token is present
        $this->validAccessTokenOrExit();

        $user = $this->getUser();
        return $this->handleView($this->view($user, 200));

    }

}

理想情况下,我希望validAccessTokenOrExit()函数终止请求,并使用适当的消息返回401状态代码。这意味着我可以在此函数中处理身份验证,并在API中的多个操作中重复使用它。

但是我似乎无法找到终止另一个函数的响应的方法,而且我总是必须从被调用的动作返回一个Response。

是否有任何干净的解决方案可以实现这一目标或类似的东西?

3 个答案:

答案 0 :(得分:1)

如果抛出一个异常,其接口Symfony\Component\HttpKernel\Exception\HttpExceptionInterface(例如Symfony\Component\HttpKernel\Exception\HttpException)的状态代码已设置(第一个参数为HttpException的401),它将由HttpKernel处理以你期待的方式。

例如......

throw new HttpException(401, 'Something went wrong');

..将被转换为401作为状态代码的响应。

答案 1 :(得分:0)

您可以在控制器中使用$this->createAccessDeniedException('message')

这将创建AccessDeniedException,终止当前请求并返回403一条消息。

答案 2 :(得分:0)

我确实遇到过这种情况,暂时我用return来调用终止函数。有效时从函数返回false。

 if($r=$this->validAccessTokenOrExit()){ 
   return $r;
 } 

或者,我使用以下两种方法从另一个函数重定向或渲染视图并终止流程。

重定向:

header('location:'. $this->generateUrl('deals_product_view', array('id' => 1)));
exit;

渲染视图:

     $response = new Response();    
     $response->setContent($this->renderView($view_file, $params ));
     $response->send();
     exit;