首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 4- KnpPaginator包“服务未找到,即使它存在于app的容器中”

Symfony 4- KnpPaginator包“服务未找到,即使它存在于app的容器中”
EN

Stack Overflow用户
提问于 2018-02-12 05:32:23
回答 4查看 18.1K关注 0票数 9

我一直在学习教程,所有的说明都表明它是以完全相同的方式完成的,但在Symfony 4中似乎不起作用。有什么东西我忽略了吗?还是包根本不兼容?

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

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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
$paginator  = $this->get('knp_paginator');

并得到以下错误:

服务"knp_paginator“:尽管它存在于应用程序的容器中,但"App\Controller\PhotoController”中的容器是一个较小的服务定位器,只知道“原则”、"form.factory“、"http_kernel”、"request_stack“、”路由器“、"security.authorization_checker”、"security.token_storage“、”序列化器“、”会话“和"twig”服务。除非你需要额外的懒惰,试着用依赖注入代替。否则,您需要使用"PhotoController::getSubscribedServices()“来声明它。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-12 06:26:02

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

代码语言:javascript
复制
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyController extends Controller
{

    public function myAction()
    {
        $paginator  = $this->get('knp_paginator');

或者最好离开AbstractController并将knp_paginator服务注入到您的操作中:

代码语言:javascript
复制
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Knp\Component\Pager\PaginatorInterface;

class MyController extends AbstractController
{

    public function myAction(PaginatorInterface $paginator)
    {
        $paginator->paginate()...
    }
票数 29
EN

Stack Overflow用户

发布于 2018-04-08 15:50:21

在我的例子中,我使用AbstractController,正如malcolm所说,在您的操作中直接注入服务是更好的选择,即便如此,我还是多次调用一个方法,并且我认为覆盖getSubscribedServices对于我的工作来说是更紧密的。

代码语言:javascript
复制
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);
    //...

}
票数 8
EN

Stack Overflow用户

发布于 2018-05-29 09:53:12

就像文件里说的。您必须扩展基类Controller类,或者使用依赖项注入代替container.html#service-parameters

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48740064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档