我正在尝试设置一个通用服务来处理我在项目中经常使用的常用功能。例如,如果用户想要购买虚拟货币的东西,那么如果用户的帐户中有足够的虚拟货币,则会有一个检查功能。
如果用户没有足够的虚拟货币,我希望此函数能够生成JSOn响应,但是对于cource,只允许控制器响应。但这意味着我必须检查我使用此功能的每个操作,无论购买是否有效。
以下是我的Controller中的函数调用:
$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;
}
有更好的方法吗?我真的想避免一遍又一遍地在控制器中做同样的事情。
提前致谢!
答案 0 :(得分:0)
我想到了两个选项,两者都是非常优雅的解决方案,但两者都需要很少的工作:
<强> 1。创建自定义异常监听器
创建自定义例外,我们将其称为InsufficientMoneyException
。然后,您的服务可以照原样,但不会返回响应,而是抛出您的自定义异常(如果用户没有足够的钱)。然后,您create custom exception listener会收听InsufficientMoneyException
自定义异常并返回您想要的JsonResponse
。
<强> 2。创建自定义注释
您可以使用此批注创建自定义批注并标记控制器操作。它看起来像这样
/**
* @MinimumMoneyRequired("50")
*/
public function buyAction()
{
(...)
}
这个选项非常好并且解耦但需要很多配置。这很好blog post,详细描述了如何创建自定义注释