標準コントローラを拡張する代わりに、クラスの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 }
キャッシュをクリアしてみてください。
あなたのルートは コントローラをサービスとして参照 に設定されていますか?そうでない場合、symfonyはサービス定義を利用しないため、指定した引数は使用されません。
まず、サービスコンテナで利用できるものを見てみましょう。
λ 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(
)
);
}
}