在Symfony中使用分页类的正确方法

在Symfony中使用分页类的正确方法,symfony,pagination,symfony-2.3,knppaginator,Symfony,Pagination,Symfony 2.3,Knppaginator,我正在尝试使用此Symfony捆绑包: 在文档中,他们将其用作控制器。因此,它们可以轻松访问服务容器或请求对象 但据我所知,条令查询应该在存储库中,而不是控制器中,对吗?我已经有了一个返回记录的函数。只是分页服务不希望在实例化时得到“结果”。它需要查询。因此,我不能将“结果”返回给控制器,而是在函数中间使用分页器 另一方面,像处理服务或请求这样的东西确实属于控制器 那么这应该怎么做呢?起初,我考虑将“knp_paginator”服务和请求对象注入存储库。但是我认为这不是正确的方法。假设您在该存

我正在尝试使用此Symfony捆绑包:

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

但据我所知,条令查询应该在存储库中,而不是控制器中,对吗?我已经有了一个返回记录的函数。只是分页服务不希望在实例化时得到“结果”。它需要查询。因此,我不能将“结果”返回给控制器,而是在函数中间使用分页器

另一方面,像处理服务或请求这样的东西确实属于控制器


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

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

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

我认为请求对象在堆栈中的位置不应超过控制器

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

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"]]
然后,在存储库中,您应该使paginator可用于QueryBuilder:

public function setPaginator($paginator)
{
    $this->paginator = $paginator;
}

...

$this->paginator->paginate($qb->getQuery(), $page, $limit);
为了将
$page
$limit
变量放入存储库,您不需要请求对象。只需将它们作为参数传递给存储库调用:

// 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);

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

我想说,请求对象不应该比控制器更深入堆栈

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

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"]]
然后,在存储库中,您应该使paginator可用于QueryBuilder:

public function setPaginator($paginator)
{
    $this->paginator = $paginator;
}

...

$this->paginator->paginate($qb->getQuery(), $page, $limit);
为了将
$page
$limit
变量放入存储库,您不需要请求对象。只需将它们作为参数传递给存储库调用:

// 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);

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

例如,自定义存储库返回$qb(不是返回结果,而是它的querybuilder)


例如,$qb由自定义存储库返回(不是返回结果,只是返回结果的querybuilder)


Bu我确实需要请求对象来获取url参数($Request->query->getInt('page',1)),但我也认为我们不应该在任何地方传递此对象…Bu我确实需要请求对象来获取url参数($Request->query->getInt('page',1)),但我也认为我们不应该在任何地方传递此对象。。。