此异常出现在使用早期版本(Symfony 3)中的代码的Symfony 4项目中, 其中通过服务容器请求服务, 例如, 以下控制器应引发异常:
<
?phpnamespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use ReCaptcha\ReCaptcha;
use Doctrine\ORM\Query\Expr\Join;
use App\Entity\FosUser;
// Note as well that extends the 'Symfony\Bundle\FrameworkBundle\Controller\Controller' class // which is deprecated in Symfony 4class AuthorsController extends Controller{// Controller that shows all the news from x repositorypublic function show(Request $request, FosUser $user){$em = $this->
getDoctrine()->
getManager();
$repoArticles = $em->
getRepository('App:News');
$pagination = $repoArticles->
createQueryBuilder('a')->
where('a.published = 1')->
andWhere('a.author = :user')->
orderBy('a.datepublished', 'DESC')->
setParameter('user', $user->
getId())->
getQuery()->
getResult();
// Important: and paginates the query with knp paginator, however accesing the service container$paginator = $this->
get('knp_paginator');
$entities = $paginator->
paginate($pagination, $request->
query->
getInt('page', 1), 14);
return $this->
render('news/show.html.twig', array('user' =>
$user, 'entities' =>
$entities));
}}
代码中描述的问题是由你尝试访问KNP的分页器服务引起的。在本文中, 我们将向你简要介绍如何在Symfony 4项目中解决此异常。
解基本上, 解决此问题所需要做的是分析现有代码, 并从何处请求分页器服务。如果从服务容器中需要它, 则需要删除该变量, 并将PaginatorInterface直接注入控制器。这将公开与在服务容器中工作方式相同的变量, 还要注意, 控制器需要扩展AbstractController类, 而不是Controller类, 因为这将防止将来的弃用警告:
<
?phpnamespace App\Controller;
// 1. Include the AbstractController classuse Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
// 2. The controller extends now the AbstractControllerclass ExampleController extends AbstractController{// 3. The paginator is injected in the action $paginatorpublic function exampleaction(PaginatorInterface $paginator){$em= $this->
get('doctrine.orm.entity_manager');
$dql= "SELECT a FROM AcmeMainBundle:Article a";
$query = $em->
createQuery($dql);
// 3. Use paginator to do something with the paginator$pagination = $paginator->
paginate($query, /* query NOT result */$request->
query->
getInt('page', 1), /*page number*/10 /*limit per page*/);
}}
我们的例子的解决方案
以下代码段显示了如何通过AbstractController的实现正确修复初始示例, 以及如何将分页器直接插入动作中:
<
?phpnamespace App\Controller;
// Use the abstract controller insteaduse Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use ReCaptcha\ReCaptcha;
use Doctrine\ORM\Query\Expr\Join;
use App\Entity\FosUser;
// The controller extends now the AbstractControllerclass AuthorsController extends AbstractController{// Controller that shows all the news from x repository// The paginator is injected in the action $paginatorpublic function show(Request $request, FosUser $user, PaginatorInterface $paginator){$em = $this->
getDoctrine()->
getManager();
$repoArticles = $em->
getRepository('App:News');
$pagination = $repoArticles->
createQueryBuilder('a')->
where('a.published = 1')->
andWhere('a.author = :user')->
orderBy('a.datepublished', 'DESC')->
setParameter('user', $user->
getId())->
getQuery()->
getResult();
$entities = $paginator->
paginate($pagination, $request->
query->
getInt('page', 1), 14);
return $this->
render('news/show.html.twig', array('user' =>
$user, 'entities' =>
$entities));
}}
【如何解决Symfony 4中的KnpPaginator异常(即使应用容器中存在服务” knp_paginator” ,也找不到)】编码愉快!
推荐阅读
- Flutters资源加载速度比原生Android快
- 如何在C#中将Unixtime转换为DateTime类,反之亦然
- 2020年最值得学习的编程语言列表
- 如何磨练/提高你的编码技能()
- 如何解决C#WinForms构建异常(ClickOnce不支持请求执行级别” requireAdministrator”。)
- 关于HTML/CSS模板的7个惊人秘密
- 如何在任何环境下强制基于C#的WinForms应用程序以管理员权限运行()
- Golang与Node比较(性能,可伸缩性及更多)
- 在编程中如何确定一年是否飞跃