Symfony 4 - KnpPaginator捆绑"服务未找到,即使它存在于应用程序的容器中"

Dar*_*ius 8 php symfony doctrine-orm

我一直在关注教程,并且所有说明都表明它完全以相同的方式完成,但它似乎在Symfony 4中不起作用.是否有一些我忽略的东西或者捆绑包是不兼容的?

我跑了: composer require knplabs/knp-paginator-bundle

bundles.php由于Flex,它被自动加载到.

将以下内容插入config/services.yaml:

knp_paginator:
    page_range:                 5          # default page range used in pagination control
    default_options:
        page_name:              page       # page query parameter name
        sort_field_name:        sort       # sort field query parameter name
        sort_direction_name:    direction  # sort direction query parameter name
        distinct:               true       # ensure distinct results, useful when ORM queries are using GROUP BY statements
    template:
        pagination: KnpPaginatorBundle:Pagination:twitter_bootstrap_v3_pagination.html.twig     # sliding pagination controls template
        sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig                         # sort link template
Run Code Online (Sandbox Code Playgroud)

试图在控制器中使用以下内容:

$paginator  = $this->get('knp_paginator');
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

未找到服务"knp_paginator":即使它存在于应用程序的容器中,"App\Controller\PhotoController"中的容器也是一个较小的服务定位器,只知道"doctrine","form.factory","http_kernel", "request_stack","router","security.authorization_checker","security.token_storage","serializer","session"和"twig"服务.除非您需要额外的懒惰,否则请尝试使用依赖注入.否则,您需要使用"PhotoController :: getSubscribedServices()"声明它.

mal*_*olm 22

你必须扩展Controller而不是AbstractController类:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyController extends Controller
{

    public function myAction()
    {
        $paginator  = $this->get('knp_paginator');
Run Code Online (Sandbox Code Playgroud)

或者更好地离开AbstractControllerknp_paginator为您的行动注入服务:

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Knp\Component\Pager\PaginatorInterface;

class MyController extends AbstractController
{

    public function myAction(PaginatorInterface $paginator)
    {
        $paginator->paginate()...
    }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,[Symfony 4.2中已弃用Controller](https://github.com/symfony/symfony/commit/a7e319d9e1316e2e18843f8ce15b67a8693e5bf9)并将在Symfony 5中将其删除,因此您需要使用注入方法。 (2认同)

Sfb*_*auw 8

就我而言AbstractController,正如我malcolm所说,最好在您的操作中直接注入服务,即使如此,我也多次调用了一个方法,我认为覆盖getSubscribedServices对于我的用法是明智的。

public static function getSubscribedServices(): array
{
    $services = parent::getSubscribedServices();
    $services['fos_elastica.manager'] = RepositoryManagerInterface::class;
    $services['knp_paginator'] = PaginatorInterface::class;

    return $services;
}

private function listHandler(Search $search, Request $request, int $page): Response
{
    //...
    $repository = $this->container->get('fos_elastica.manager')->getRepository(Foo::class);
    //...

}
Run Code Online (Sandbox Code Playgroud)