Symfony2服务响应


Symfony2 Service Response

我试图设置一个通用服务,该服务处理我在项目中经常使用的常见功能。例如,如果用户想购买虚拟货币,则会有一个功能来检查用户的帐户中是否有足够的虚拟货币。

如果用户没有足够的虚拟货币,我希望这个函数能做出JSOn响应,但当然,只有控制器可以响应。但这意味着我必须检查我使用该功能的每一个操作,无论购买是否有效。

这是我的控制器中的函数调用:

$purchaes= $this->get('global_functions')->payVirtualCurrency($user_id,  $currency_amount);
if($change instanceof JsonResponse){
    return $change;
}

和功能:

public function payVirtualCurrency($user_id, $currency_amount){
    $user = $this->dm->getRepository('LoginBundle:User')->findOneById($user_id);
    if($user->getVirtualCurrency() < $currency_amount){
        return new JsonResponse(array('error' => $this->trans->trans('Insufficient amount of virtual Currency')));
    }
    return true;
}

有更好的方法吗?我真的想避免在控制器中一遍又一遍地做同样的事情。

提前感谢!

我想到了两个选项,它们都是非常优雅的解决方案,但都只需要很少的工作:

1.创建自定义异常侦听器

创建自定义异常,我们称之为InsufficientMoneyException。然后,您的服务可以保持原样,但它不会返回响应,而是抛出您的自定义异常(以防用户没有足够的钱)。然后,创建自定义异常侦听器,该侦听器列出InsufficientMoneyException自定义异常并返回所需的JsonResponse

2.创建自定义注释

您可以创建自定义注释,并使用此注释标记控制器操作。它看起来像这个

/**
* @MinimumMoneyRequired("50")
*/
public function buyAction()
{
(...)
}

这个选项非常好,而且是解耦的,但它需要相当多的配置。这是一篇很好的博客文章,详细描述了如何创建自定义注释