web-dev-qa-db-ja.com

Symfony2のサービスとしてTwigを注入する

標準コントローラを拡張する代わりに、クラスの1つにTwigを挿入したいと思います。

コントローラ:

namespace Project\SomeBundle\Controller;

use Twig_Environment as Environment;

class SomeController
{
    private $twig;

    public function __construct( Environment $twig )
    {
        $this->twig    = $twig;
    }

    public function indexAction()
    {
        return $this->twig->render(
            'SomeBundle::template.html.twig', array()
        );
    }
}

そしてservices.yml次のものがあります。

project.controller.some:
    class: Project\SomeBundle\Controller\SomeController
    arguments: [ @twig ]

私が得ているエラーは:

SomeController :: __ construct()はTwig_Environmentのインスタンスでなければなりません。

しかし、私は@twig経由のconfig。何が悪いのか分かりません。

編集:

正しいコードを追加-これは問題を修正したものです:

// in `routing.yml` refer to the service you defined in `services.yml` 
project.controller.some
    project_website_home:
        pattern:  /
        defaults: { _controller: project.controller.some:index }
22
ed209
  1. キャッシュをクリアしてみてください。

  2. あなたのルートは コントローラをサービスとして参照 に設定されていますか?そうでない場合、symfonyはサービス定義を利用しないため、指定した引数は使用されません。

6
simshaun

まず、サービスコンテナで利用できるものを見てみましょう。

λ php bin/console debug:container | grep twig
  twig                                                                 Twig_Environment
  ...

λ php bin/console debug:container | grep templa
  templating                                                           Symfony\Bundle\TwigBundle\TwigEngine
  ...

ここで、おそらくTwig_Enviroment(twigサービス)ではなくTwigEngineクラス(テンプレートサービス)を使用します。テンプレートサービスはvendor\symfony\symfony\src\Symfony\Bundle\TwigBundle\TwigEngine.phpにあります

...
class TwigEngine extends BaseEngine implements EngineInterface
{
...

このクラスには、render(..)とrenderResponse(...)という2つのメソッドがあります。つまり、残りのコードは、以下の例で問題なく動作するはずです。また、TwigEngineがtwigサービス(Twig_Enviromentクラス)を挿入して、親クラスBaseEngineを構築することもわかります。したがって、twigサービスとTwig_Environmentをリクエストするエラーは消えるはずです。

したがって、コードでは次のようにします。

# app/config/services.yml
services:
    project.controller.some:
        class: Project\SomeBundle\Controller\SomeController
        arguments: ['@templating']

あなたのクラス

namespace Project\SomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Symfony\Component\HttpFoundation\Response;

class SomeController
{
    private $templating;

    public function __construct(EngineInterface $templating)
    {
        $this->templating = $templating;
    }

    public function indexAction()
    {
        return $this->templating->render(
            'SomeBundle::template.html.twig',
            array(

            )
        );
    }
}
9
DevWL