2017-05-31 10 views
2

Pre-note:私はDrupal 7の背景からSymfonyを学んでいます。Symfony 2.8 injecting twig

私はカスタムモデルを作成しましたが(symfonyのサービスと呼んでいると思いますが)、変数をtwig経由で配列をレンダリングしたいと考えています。

私はこのリンクを発見し、この注射アプローチは、トリックを行うだろうと思った:悲しいこと http://symfony.com/doc/2.8/service_container.html

、Iおよび以下のエラーと最大:

だから、

Type error: Argument 1 passed to AppBundle\Model\Newsletter::__construct() must be an instance of AppBundle\Model\Twig_Environment, none given, called in /home/dan/working_files/symfony-playground/src/AppBundle/Controller/DefaultController.php on line 130

、私が何であるか疑問に思って私のカスタムモデル/サービス/クラスの中で枝を使うことができるように許容できるアプローチですか?

それは使用であれば、ここに参照のための私のコードの一部です:/

namespace AppBundle\Model; 

class Newsletter 
{ 
    private $twig; 
    public function __construct(Twig_Environment $twig) 
    { 
     $this->twig = $twig; 
    } 
} 
Newsletter.php

services.yml

services: 
    appbundle.newsletter: 
     class: AppBundle\Model\Newsletter 
     arguments: ['@twig'] 

のsrc/AppBundle /モデルを

私のモデルに電話する

$newsletter = new Newsletter(); 
+1

あなたのモデルをサービスとして呼び出して、依存関係を注入する必要があります。コントローラーで呼び出すと、このようなサービスが得られます。$ newsletter = $ this-> get( 'appbundle.newsletter'); ' – ArtOsi

+0

申し訳ありません。あなたが何を意味するか'$ newsletter = new Newsletter();'という行は 'DefaultController.php'から現在呼び出されています。 – retrodans

+0

コントローラはサービスを受けるためにヘルパーを持っています。単純に '$ this-> get( 'service_name');を呼び出すと依存関係を注入してサービスを得ることができます。 'new ClassName()'でクラスを呼び出すと、twigインスタンスをクラスコンストラクタに手動で渡す必要があります。 – ArtOsi

答えて

0

このようEngineInterfaceと小枝を変更しよう:

$this->get('service_name'); 
+0

これを変更しても悲しいことに問題は解決していないようです – retrodans

+0

2つの問題がありました。 1つはEngineInterfaceに切り替わり、もう1つはモデルを呼び出す方法を変更していたので、代わりに '$ this-> get( 'service_name'); 'を使用しました – retrodans

+0

あなたを助けてくれてありがとう! :) –

0

あなたが$newsletter = new Newsletter();を呼び出すとき:あなたはOサービスを呼び出す必要があります後

services: 
    appbundle.newsletter: 
     class: AppBundle\Model\Newsletter 
     arguments: ['@templating'] 

そして

namespace AppBundle\Model; 

use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface; 

class Newsletter 
{ 
    private $twig; 
    public function __construct(EngineInterface $templating) 
    { 
     $this->twig = $templating; 
    } 
} 

あなたはsにアクセスしていないあなたが行ったサービス定義を無視して、依存関係注入コンテナを介して処理します。

DICを活用して、サービスに@twigなどの依存関係を注入するには、サービスコンテナを使用してサービスインスタンスを取得する必要があります。 symfonyのコントローラ上でそれを行うには、このようにそれを行うことができます。YAMLファイルで定義され、それはあなたは、コンテナを通じてもう一度あなたのサービスを使用し、すべての場所の間で共有されるよう

@twigつもりあなたのサービスに注入され

$newsletter = $this->get('appbundle.newsletter'); 

関連する問題