我试图设置一个通用服务来处理我在项目中经常使用的通用功能。例如,如果用户想要购买虚拟货币的东西,就会有一个功能来检查用户的账户中是否有足够的虚拟货币。
如果用户没有足够的虚拟货币,我希望此函数做出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;
}有没有更好的方法来做这件事?我真的想避免在控制器中一遍又一遍地做同样的事情。
提前感谢!
发布于 2015-03-31 01:09:44
我想到了两个选择,这两个都是非常优雅的解决方案,但都需要很少的工作:
1.创建自定义异常监听器
创建自定义异常,让我们称其为InsufficientMoneyException。然后,您的服务可以保持原样,但不是返回响应,而是抛出自定义异常(以防用户没有足够的钱)。然后,执行create custom exception listener,它将侦听InsufficientMoneyException自定义异常并返回所需的JsonResponse。
2.创建自定义注释
您可以创建自定义注释,并使用此注释标记控制器操作。它看起来就像这样
/**
* @MinimumMoneyRequired("50")
*/
public function buyAction()
{
(...)
}这个选项真的很好,而且是解耦的,但它需要相当多的配置。这是一个很好的blog post,详细描述了如何创建自定义注释
https://stackoverflow.com/questions/29350517
复制相似问题