私はチュートリアルに従っていますが、すべての指示はまったく同じ方法で行われていることを示していますが、Symfony 4では動作しないようです。見落としているものや、単に互換性のないものはありますか?
実行しました:composer require knplabs/knp-paginator-bundle
Flexのおかげで、自動的にbundles.php
にロードされました。
以下を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
コントローラで次を使用しようとしました:
$paginator = $this->get('knp_paginator');
次のエラーが発生しました:
サービス "knp_paginator"が見つかりません:アプリのコンテナーに存在していても、 "App\Controller\PhotoController"内のコンテナーは、 "doctrine"、 "form.factory"、 "http_kernel"のみを認識する小さなサービスロケーターです。 「request_stack」、「router」、「security.authorization_checker」、「security.token_storage」、「serializer」、「session」、および「twig」サービス。余分な遅延を必要としない限り、代わりに依存性注入を使用してみてください。それ以外の場合は、「PhotoController :: getSubscribedServices()」を使用して宣言する必要があります。
Controller
クラスの代わりにAbstractController
クラスを拡張する必要があります。
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class MyController extends Controller
{
public function myAction()
{
$paginator = $this->get('knp_paginator');
またはAbstractController
のままにしてknp_paginator
アクションへのサービス:
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Knp\Component\Pager\PaginatorInterface;
class MyController extends AbstractController
{
public function myAction(PaginatorInterface $paginator)
{
$paginator->paginate()...
}
私の場合、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);
//...
}
ドキュメントにあるように。ベースController
クラスを拡張するか、代わりに依存性注入を使用する必要があります https://symfony.com/doc/current/service_container.html#service-parameters
私の場合、symfony 4.3を使用しています。クラスを引数としてメソッドにインジェクトしました。
public function list(ProductManager $productManager)
{
$products = $productManager->prepareProducts();
return $products;
}