Symfony2从控制器中删除业务逻辑和正确使用模型的最佳方法

时间:2015-10-18 14:45:45

标签: symfony model-view-controller

我正在寻找从控制器中删除业务逻辑和正确使用模型(以及可能的服务)的最佳方法。

以下一些细节。

实际上,我的项目更复杂,但作为示例我将使用简单博客应用程序。 我已经在接下来的步骤中创建了我的应用程序(简单博客):

  1. 创建了捆绑包
  2. 生成的实体(主题,帖子,评论)
  3. 使用doctrine:generate:crud
  4. 为每个实体生成控制器
  5. 安装了FOSUserBundle并生成了用户实体
  6. 所以,我在控制器中都需要所有方法和表格。但现在我遇到了一些麻烦:

    1. 当简单的用户只能看到时,管理员需要能够看到所有主题和帖子 他是所有者的主题和帖子。
    2. 目前有indexAction,它会为任何用户返回 findAll 。作为解决方案,我可以检查操作,如果是ROLE_USER或ADMIN,并为每个条件返回查找结果。但是这种变体在行动中保留了一些逻辑。

      我也可以为每个角色生成动作,但是如果角色数量会增加会发生什么?

      每个角色的结果解决此问题的最佳方法是什么?

      1. 我需要在保存之前编辑一些参数。
      2. 例如,我有一些调度程序,我使用features of DateTime在某些步骤中创建日期。 保存之前我需要用日期做一些计算。 我可以在控制器中使用服务或简单的$ request->参数编辑。

        保存之前编辑某些$ request参数的最佳方法是什么?

        我的问题是用粗体标记的。

        非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

  1. 我要做的是创建一个获取主题的查询。之后我会有一个方法参数,它指定查询是否应该只选择某个用户或所有主题的主题。这样的事情应该在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());
    }
    
  2. 您可以尝试使用Doctrine Events并根据您的情况创建PreUpdate。有关更多信息,请参阅文档。如果您有TopicFormType,还可以尝试form events

  3. 你不应该"编辑"一个$request,这就是为什么你不能直接这样做的原因。但是,您可以检索一个值,将其另存为$variable,然后随意执行任何操作。如果确实需要,您可以随时创建新的Request。你能否更具体地说明你想做什么?为什么这有必要?