web-dev-qa-db-ja.com

Symfony 4-KnpPaginatorバンドル「アプリのコンテナーに存在するにもかかわらず、サービスが見つかりません」

私はチュートリアルに従っていますが、すべての指示はまったく同じ方法で行われていることを示していますが、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()」を使用して宣言する必要があります。

8
Darius

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()...
    }
22
malcolm

私の場合、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);
    //...

}
8
Sfblaauw

ドキュメントにあるように。ベースControllerクラスを拡張するか、代わりに依存性注入を使用する必要があります https://symfony.com/doc/current/service_container.html#service-parameters

1
Nemus

私の場合、symfony 4.3を使用しています。クラスを引数としてメソッドにインジェクトしました。

public function list(ProductManager $productManager)
{ 
   $products = $productManager->prepareProducts(); 
   return $products;
}
0
sh6210