【问题标题】:The right way of using a pagination class in Symfony在 Symfony 中使用分页类的正确方法
【发布时间】:2016-03-21 12:45:32
【问题描述】:

我正在尝试使用这个 Symfony 捆绑包: https://github.com/KnpLabs/KnpPaginatorBundle

在文档中,他们将其用作控制器。因此他们可以轻松访问服务容器或请求对象。

但据我了解,Doctrine 查询应该在存储库中,而不是控制器中,对吧?而且我已经有一个返回记录的函数。只是分页服务在实例化时并不期望“结果”。它想要查询。所以我不能将“结果”返回给控制器,而是在这个函数的中间使用分页器。

另一方面,诸如使用服务或请求之类的东西确实属于控制器。

那么这应该怎么做呢?起初我考虑将“knp_paginator”服务和请求对象注入存储库。但我认为这不是正确的方法。

【问题讨论】:

    标签: symfony pagination symfony-2.3 knppaginator


    【解决方案1】:

    我想说的是,Request 对象不应该比控制器更深入堆栈。

    没有什么可以阻止您将分页器直接注入您的自定义存储库,那么为什么不这样做呢?

    your.repository.service.definition:
        class: Your\Repository\Class
    
        # for symfony 2.3
        factory_service: doctrine
        factory_method: getRepository
    
        # for symfony 2.8 and higher
        factory: ["@doctrine.orm.entity_manager", getRepository]
    
        arguments:
          - YourBundle:YourEntity
        calls:
            - [setPaginator, ["@knp_paginator"]]
    

    在存储库中,您应该拥有可与 QueryBuilder 一起使用的分页器:

    public function setPaginator($paginator)
    {
        $this->paginator = $paginator;
    }
    
    ...
    
    $this->paginator->paginate($qb->getQuery(), $page, $limit);
    

    为了将您的 $page$limit 变量放入存储库,您不需要 Request 对象。只需将它们作为参数传递给存储库调用:

    // In your controller
    // You can use forms here if you want, but for brevity:
    $criteria = $request->get('criteria');
    $page = $request->get('page');
    $limit = $request->get('limit');
    
    $paginatedResults = $myCustomRepository->fetchPaginatedData($criteria, $page, $limit);
    

    将请求对象进一步向下传递到控制器意味着您的抽象存在泄漏。您的应用程序无需关心 Request 对象。实际上,该请求很可能来自其他来源,例如 CLI 命令。由于抽象级别错误,您不希望从那里创建 Request 对象。

    【讨论】:

    • 但是我确实需要 Request 对象来获取 url 参数( $request->query->getInt('page', 1) )但我也认为我们不应该在任何地方传递这个对象.. .
    【解决方案2】:

    假设您有一个Custom Repository Class,,您可以在该存储库中有一个方法,该方法返回一个查询或查询生成器的有效实例,然后您从控制器调用该方法并将其传递给paginate() 方法。

    【讨论】:

      【解决方案3】:

      例如 $qb 由自定义存储库返回(不是返回结果,只是它的查询构建器)

      $paginator = $this->get('knp_paginator');
      $pagination = $paginator->paginate(
          $qb->getQuery(),
          $request->query->getInt($pageParameterName, 1),
          $perPage,
          array('pageParameterName' => $pageParameterName)
      );
      

      【讨论】:

        猜你喜欢
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 2019-01-13
        相关资源
        最近更新 更多