vkr / pager-bundle
适用于 Symfony2/3 的无视图分页组件
Requires
- php: >=5.6
- symfony/symfony: ~2.8|~3.0
- vkr/settings-bundle: ~1.1
Requires (Dev)
- phpunit/phpunit: >=5.4
This package is auto-updated.
Last update: 2024-09-20 22:18:00 UTC
README
这是一个简单的 Symfony 分页组件。与其他分页组件不同,它完全无视图依赖,采用 SOA 风格编写 - 你先写自己的服务,然后在控制器中获取这个服务和分页服务,然后获取所有需要的分页数据,以供后续在视图层使用。
此组件依赖于 VKRSettingsBundle,请在使用之前阅读其文档。
安装
除了在 Composer 和 AppKernel.php 中启用组件外,几乎没有什么需要做的。但是,如果你想要使用基于设置的每页记录数,你需要为每个调用的分页实例创建一个设置。阅读 VKRSettingsBundle 文档以获取创建设置的详细信息。
使用
解析器
有一个名为 getPagerProps()
的公共方法。为了使用它,你需要编写一个实现了 VKR\PagerBundle\Interfaces\PageableInterface
的解析器。该接口有一个名为 getNumberOfRecords()
的方法,应该返回可以使用分页显示的总记录数。以下是一个解析器类的示例。
class MyParser implements VKR\PagerBundle\Interfaces\PageableInterface
{
private $em;
public function __construct(Doctrine\ORM\EntityManager $em)
{
$this->em = $em;
}
public function getNumberOfRecords(array $additionalArguments = [])
{
$allRecords = $this->em->getRepository('AppBundle:MyEntity')->findAll();
if (!$allRecords) {
return 0;
}
return sizeof($allRecords);
}
}
请注意,这个查询在大量数据上可能非常慢,因此请尝试使用聚合函数和索引。
使用额外的参数
如果你的 getNumberOfRecords()
实现需要参数,你有两种选择。你可以将其作为类属性传递,或者使用可选的 $additionalArguments 数组,该数组作为控制器中 getPagerProps()
的第四个参数传递 - 这种方式推荐用于不需要查询结果在其他地方,并且将你的解析器类注册为服务的情况。
解析器
public function getNumberOfRecords(array $additionalArguments = [])
{
$query = "SELECT a FROM table1 a WHERE a.id IN ($additionalArguments['ids'])";
...
}
控制器
public function myControllerAction()
{
...
$additionalArguments = [
'ids' => [1,2,3]
];
$pagerProps = $pager->getPagerProps($parser, $request->getRequestUri(), $recordsPerPage, $additionalArguments);
...
}
控制器
将以下内容添加到你的控制器中
$parser = $this->get('my_parser_service');
$pager = $this->get('vkr_pager.pager');
$recordsPerPage = 20;
$pagerProps = $pager->getPagerProps($parser, $request->getRequestUri(), $recordsPerPage);
如果你想要禁用分页并显示所有结果在单页上,使用
$recordsPerPage = -1;
使用 getPagerProps()
的另一种方法是定义一个设置以简化 $recordsPerPage
的自定义。如果你有这样一个设置,你可以将其用作第三个参数
$recordsPerPageSettingName = 'records_per_page';
$pagerProps = $pager->getPagerProps($parser, $request->getRequestUri(), $recordsPerPageSettingName);
生成的 PagerProps
对象是一个内存中的实体,具有以下属性
$currentPage
- 当前页码,对应于page
查询字符串参数。默认为 1。$uriWithoutPage
- 当前页 URI,除了page
之外的所有查询字符串参数。它还以 ? 或 & 结尾。$recordsPerPage
- 每页可以显示的最大记录数。$firstResult
- 如果你有包含 N 条记录的零索引数组,则此键指示需要显示在当前页上的记录的第一个索引。$firstResult
和$recordsPerPage
大约对应于 SQL LIMIT 子句的两个参数。$numberOfPages
- 选择的总页数。
这些属性可以通过标准获取器(如 getCurrentPage()
等)访问。
请注意,这里实际上没有记录,因为此组件不会进行任何数据库查询。你需要编写一个类,将此数据转换为查询。
视图
你需要手动将生成的数组传递到视图中。此组件不帮助你显示内容,因此它可以与任何模板技术一起使用。在 Resources/views/pager_macro.html.twig
中有一个小示例,说明如何在 Twig 中使用它,它包括一些 Twitter Bootstrap 类。
如果您使用 Twig,您还可以使用包含在包中的自定义过滤器 page()
。它会将页面属性追加到查询字符串。
<a href="{{ pagerProps.getUriWithoutPage() | page(page_number) }}">
API
void Pager::__construct(VKR\SettingsBundle\SettingsRetriever $settingsRetriever)
VKR\PagerBundle\Entity\Perishable\PagerProps Pager::getPagerProps(VKR\PagerBundle\Interfaces\PageableInterface $parser, string $requestUri, int|string $recordsPerPageData, array $additionalArguments = [])
如果第三个参数是字符串,则解释为设置名称,如果是整数,则认为是每页实际记录数。
int PageableInterface::getNumberOfRecords(array $additionalArguments = [])
获取在此视图中可能显示的总记录数。
此外,由于简洁起见,省略了 VKR\PagerBundle\Entity\Perishable\PagerProps 实体上的获取器和设置器。