代码之家  ›  专栏  ›  技术社区  ›  zen

symfony 4从控制器动作中移除大部件的位置

  •  0
  • zen  · 技术社区  · 7 年前

    我使用的是symfony 4,我想从控制器的动作中删除大部分到另一种方法。但在这一部分中,使用的数据来自 Request 对象和返回 Response 对象。

    我有两个选项可以移动此部分:

    1. 移动到控制器中的私有方法。
    2. 移入服务方法。

    1. 集合 请求 对象作为方法的参数,并在方法中从中获取所有数据。
    2. 从中获取所有数据 请求 对象,并将其设置为方法的参数。

    哪条路更好?为什么?也许有更好的方法?

    回归正常吗 响应 从服务方法到控制器的操作的对象?

    代码示例:

    public function index(Request $request): Response
    {
        if(!$this->hasSuccessAuth($request)) {
            return $this->authenticateClient();
        }
    
    }
    
    private function hasSuccessAuth(Request $request): bool
    {
        $passwordCookie = $request->cookies->get('secret', NULL);
    
        if(self::CHECK_AUTH_MODE === $request->query->get('mode') and
            $this->authService->isCorrectPasswordCookie($passwordCookie)) {
    
            return true;
        }
    
        return false;
    }
    
    private function authenticateClient(): Response
    {
        if($this->authService->isSuccessHttpAuth()) {
    
            $passwordForCookie = $this->authService->getPassword();
    
            return new Response("success\nsecret\n".$passwordForCookie."\n");
        }
    
        return new Response('', Response::HTTP_FORBIDDEN);
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   fgamess    7 年前

    我有两个选项可以移动此部分:

    1. 移动到控制器中的私有方法。
    2. 移入服务方法。

    实际上,您可以在控制器或服务方法中转移到私有方法。如果您移动到控制器中的私有方法,我的建议是您应该创建一个包装控制器类,您的控制器将扩展该类,并将这个私有方法放入其中。显然,如果初始控制器已经扩展了基本symfony控制器,那么这个控制器将扩展它。如果你想用的话,这个很好 哈苏塞萨特 身份验证 仅与其他控制器类一起使用。因为如果您将此逻辑放入服务中,其他服务或命令将能够使用它。这取决于你。

    如果现在您希望在应用程序的任何地方访问这个逻辑,最好创建一个服务。但是您应该问问自己,这个新服务是否会有自己的数据,或者会从依赖注入中受益。如果是,创建服务是一个好主意。如果没有,这意味着您将只使用这个逻辑来处理作为参数给出的数据并返回结果。在这种情况下,您应该使用静态方法创建一个助手类。

    我有两个选项,如何处理方法参数:

    1. 将请求对象设置为方法的参数,并在方法中从中获取所有数据。
    2. 从控制器操作中的请求对象获取所有数据,并将其设置为方法的参数。

    这取决于您,但如果它是我的应用程序,我会选择将整个请求对象作为方法的参数,并在方法内部提供来自它的所有数据。

    还有最后一件事:你的 身份验证 方法不使用 请求 对象。

    推荐文章