我正在寻找从控制器中删除业务逻辑和正确使用模型(以及可能的服务)的最佳方法。
以下一些细节。
实际上,我的项目更复杂,但作为示例我将使用简单博客应用程序。 我已经在接下来的步骤中创建了我的应用程序(简单博客):
所以,我在控制器中都需要所有方法和表格。但现在我遇到了一些麻烦:
目前有indexAction,它会为任何用户返回 findAll 。作为解决方案,我可以检查操作,如果是ROLE_USER或ADMIN,并为每个条件返回查找结果。但是这种变体在行动中保留了一些逻辑。
我也可以为每个角色生成动作,但是如果角色数量会增加会发生什么?
每个角色的结果解决此问题的最佳方法是什么?
例如,我有一些调度程序,我使用features of DateTime在某些步骤中创建日期。 保存之前我需要用日期做一些计算。 我可以在控制器中使用服务或简单的$ request->参数编辑。
保存之前编辑某些$ request参数的最佳方法是什么?
我的问题是用粗体标记的。
非常感谢您的帮助!
答案 0 :(得分:2)
我要做的是创建一个获取主题的查询。之后我会有一个方法参数,它指定查询是否应该只选择某个用户或所有主题的主题。这样的事情应该在TopicRepository
:
public function findTopics($userId = false)
{
$query = $this->createQueryBuilder('topic');
if($userId) {
$query->join('topic.user', 'user')
->where('user.id = :user_id')
->setParameter(':user_id', $userId)
;
}
return $query->getQuery()->getResult();
}
因此,只要您需要仅由用户获取主题,您就会将$userId
传递给该方法,它将仅返回该用户的结果。在你的控制器中,你有类似的代码(Symfony 2.6 +):
$authorizationChecker = $this->get('security.authorization_checker');
if($authorizationChecker->isGranted('ROLE_ADMIN')){
$results = $this->get('doctrine.orm.entity_manager')->getRepository('TopicRepository')->findTopics();
} else {
$results = $this->get('doctrine.orm.entity_manager')->getRepository('TopicRepository')->findTopics($this->getUser()->getId());
}
您可以尝试使用Doctrine Events并根据您的情况创建PreUpdate
。有关更多信息,请参阅文档。如果您有TopicFormType
,还可以尝试form events。
你不应该"编辑"一个$request
,这就是为什么你不能直接这样做的原因。但是,您可以检索一个值,将其另存为$variable
,然后随意执行任何操作。如果确实需要,您可以随时创建新的Request
。你能否更具体地说明你想做什么?为什么这有必要?