bnmosria/paginator-adapter

此包已被弃用且不再维护。未建议替代包。

一个Laminas框架模块(前身为Zend Framework),它使用doctrine和zend paginator提供分页功能。

0.2.1 2020-06-06 13:30 UTC

This package is auto-updated.

Last update: 2022-11-06 20:05:22 UTC


README

描述

一个Laminas框架模块(前身为Zend Framework),它使用doctrine和zend paginator提供分页功能。

安装

您可以通过Composer安装此包

composer require bnmosria/paginator-adapter

用法

有关如何使用Laminas-Pagination的说明,请参阅此页面 https://docs.laminas.dev/laminas-paginator/usage/.

在您的实体仓库中,您返回一个包含所需结果集的doctrine分页器,例如

    use Doctrine\ORM\Tools\Pagination\Paginator;
    
    ...
    
    /**
     * Should return a doctrine paginator with a result set of posts
     * @return Paginator
     */
    public function findPostsByPagination(int $offset = 0, int $limit = 5): Paginator
    {
        $queryBuilder = $this->_em->createQueryBuilder();
        $queryBuilder->select('p')
            ->from(Post::class, 'p')
            ->orderBy('p.id', 'DESC')
            ->setFirstResult($offset)
            ->setMaxResults($limit);

        return new Paginator($queryBuilder->getQuery());
    }

然后您可以使用一个服务来请求您的PostRepository中的帖子,例如

    use Post\Repository\PostRepository;
    use PaginatorAdapter\Adapter\Factory\PaginatorFactory;
    use PaginatorAdapter\Adapter\PaginatorAdapter;
    use Laminas\Paginator\Paginator;
    
    ...
    
    /**
     * PostService constructor.
     *
     * @param PostRepository       $postRepository
     * @param PaginatorAdapter     $doctrinePaginatorAdapter
     * @param PaginatorFactory $paginatorFactory
     */
    public function __construct(
        PostRepository $postRepository,
        PaginatorAdapter $doctrinePaginatorAdapter,
        PaginatorFactory $paginatorFactory
    ) {
        $this->postRepository = $postRepository;
        $this->doctrinePaginatorAdapter = $doctrinePaginatorAdapter;
        $this->paginatorFactory = $paginatorFactory;
    }
    ...
    
    /**
     * Should return a zend paginator with a result set of posts
     *
     * @return Paginator
     */
    public function getPostsByPagination(int $offset = 0, int $limit = 5): Paginator
    {
        $postsPaginator = $this->postRepository
            ->findPostsByPagination($offset, $limit);

        $this->doctrinePaginatorAdapter
            ->setPaginator($postsPaginator);

        return $this->zendPaginatorFactory
            ->create($this->doctrinePaginatorAdapter);
    }
    
    ...

在控制器中的操作中,只需调用服务以获取包含结果集的Laminas-Paginator对象。

    use Post\Services\PostService;
    
    ...
    /**
     * PostController constructor.
     *
     * @param \Post\Services\PostService $postService
     */
    public function __construct(PostService $postService) 
    {
        $this->postService = $postService;
    }
    
    ...
    
    public function indexAction(): ViewModel
    {
        $page = $this->params()->fromRoute('page');
        $maxResult = $this->params()->fromRoute('max_per_page');

        $paginator = $this->postService
            ->getPostsByPagination($page, $maxResult);

        $paginator
            ->setCurrentPageNumber($page)
            ->setItemCountPerPage($maxResult);

        // Here you have a Laminas-Paginator, just use it in your 
        // view as documented here: https://docs.laminas.dev/laminas-paginator/usage/
        return new ViewModel(['posts' => $paginator]);
    }