我正在使用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。
是否有任何干净的解决方案可以实现这一目标或类似的东西?
答案 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;