在我的应用程序中,用户可以注册 3 种许可证:每个人都可以使用的免费许可证、人们必须付费的订阅许可证(通过外部方管理)和发票许可,这需要他们与我们联系.
人们可以在注册时或以后通过他们的个人资料选择他们的许可证。这是两个具有不同方法的不同控制器。
我有一个接收用户和许可证实体的subscription.manager
服务方法subscribe(User $user, License $license)
,并处理为用户注册正确许可证的所有逻辑。
根据用户选择的许可证,结果可能会有所不同:
- 如果他们选择免费,他们会被重定向到感谢页面
- 如果他们选择了发票,他们会被重定向到确认他们已请求发票的某个页面
- 如果他们选择订阅,则需要先将他们重定向到付款页面。
最后一个选项是简单的RedirectResponse
,但根据他们是否注册或只是更改了现有的许可证订阅,我想显示不同的页面。
处理这个问题的最佳方法是什么?
目前,我这样做:
$response = $this->get('subscription.manager')->subscribe($user, $license);
switch (true) {
case $response instanceof SuccessResponse:
return $this->redirect('success_url');
break;
case $response instanceof RequestedResponse;
return $this->redirect('requested_url');
break;
case $response instanceof RedirectResponse:
return $response;
break;
default:
throw new \Exception('Response not recognized');
}
SuccessResponse
并且RequestedResponse
是我创建的简单类,它们本身几乎没有信息,它们纯粹表明方法中发生了什么。
这允许我复制粘贴此块并简单地切换成功和请求的 url。但是,这感觉不是很理想。有没有更好的方法来做到这一点?
我想我可以创建成功和请求的响应(无论是重定向还是渲染)并将它们传递给服务方法。但这感觉就像我违反了单一责任原则。