2016-03-28 6 views
2

私は、ファイルparameters.yml持っSymfony2:twigフィルタ/拡張モジュールのparameters.ymlからコンテナパラメータを取得するには? <pre><code>parameters: ............ image_news_url: http://image.dev/news/ </code></pre> <p></p>が今私のバンドルに私は新しい小枝の拡張機能を作成します:

// src/DesktopBundle/Twig/AppExtension.php 

namespace App\DesktopBundle\Twig; 

use Symfony\Component\DependencyInjection\ContainerBuilder; 

class AppExtension extends \Twig_Extension 
{ 
public function getFilters() 
{ 
    return array(
     new \Twig_SimpleFilter('get_image', array($this, 'getImage')), 
    ); 
} 

public function getImage($domen, $image_id) 
{ 
    $o_container = new ContainerBuilder(); 

    switch($domen){ 
     case 'news': 
      return sprintf('%s%s',$o_container->getParameter('image_news_url'),$image_id.'.slide.jpg'); 
      break; 
    } 
} 

public function getName() 
{ 
    return 'app_extension'; 
} 

} をそして、私はエラーを持っている:You have requested a non-existent parameter "image_news_urlを。私を助けてくれますか?なぜ私がparameters.ymlにアクセスできないのか分かりません。 Thxは事前に私の英語のために申し訳ありません

答えて

5

問題は、自分でコンテナを作成しようとしていることが原因です。

$o_container = new ContainerBuilder(); 

これは間違っています。

あなたがアクセスしたい場合は、あなたの内線にコンテナを注入するだけです。

コンフィグ

services: 

    # [..]  

    your.twig_extension: 
     class: Your\Namespace\YourExtension 
     public: false 
     arguments: [ "@service_container" ] 
     tags: 
      - { name: twig.extension } 

クラス

use Symfony\Component\DependencyInjection\ContainerInterface; 

namespace Your\Namespace; 

class YourExtension 
{ 
    /** @var ContainerInterface */ 
    protected $container; 

    /** @param ContainerInterface $container */ 
    public function __construct(ContainerInterface $container) 
    { 
     $this->container = $container; 
    } 

    /** @return string */ 
    function getImage() 
    { 
     // some logic here 

     return $this->container->getParameter('image_news_url'); 
    } 

私はあなたの拡張機能のパラメータを選択するために、いくつかのadditonalロジックを適用するとします。そうでなければ、単に可能性:

  • 注入唯一のパラメータ自体%image_news_url%
  • 使用twig.globals設定ディレクティブ

ドキュメントの章Using Service Container Parametersの例があります。

APP /設定/ parameters.yml

image_news_url: "http://some-url.tld" 

APP /設定/ config.yml

twig: 
    globals: 
     image_news_url: %image_news_url% 

テンプレート

{{ image_news_url }} 
+1

+1;完全性のために、コードがコンテナに依存することを避けるのが最良の方法です。したがって、 'arguments:['%image_news_url%']'でパラメータのみを注入する方が良い選択です。 – Federkun

+1

は、パラメータ自体を注入するのがベストプラクティスであることに完全に同意します。 :) 私は 'switch'ステートメントを見たので、いくつかの条件に基づいてパラメータを選択したいと思っていました。だから、私は自分の答えにコンテナ自体を使っていたのです。 – nifr

0

$o_container = new ContainerBuilder();

ContainerBuilderという新しいインスタンスを宣言しても、別の(すでに存在する)インスタンスにアクセスすることはできません。 がすでに存在するインスタンスを挿入する必要があります。そして、あなたは実際にそれを望んでいない、あなただけがの1つのパラメータを望んでいるので、単にそれを注入することができます。

Twig拡張を作成したサービス定義で、このパラメータを挿入する必要があります。だから、services.xmlファイルで次のようなものがあるはずです...

<service id="twig.extension.desktop_bundle" class="App\DesktopBundle\Twig\AppExtension" public="false"> 
     <argument>%image_news_url%</argument> 
     <tag name="twig.extension" /> 
    </service> 

はその後、あなたの拡張クラスで、あなたは、コンストラクタを使用する必要があります:あなたが値を必要な場所

namespace App\DesktopBundle\Twig; 

use Symfony\Component\DependencyInjection\ContainerBuilder; 

class AppExtension extends \Twig_Extension 
{ 
    private $url; 
    public function __construct($url) 
    { 
     $this->url = $url; 
    } 
    // ... 
} 

今、あなたは$this->urlを使用することができます。

は、より多くの情報のためDependency Injectionをよく読んで。

+0

私は彼が追加のロジックをエクステンションに適用して、フェッチするパラメータを選択したかったと思います。さもなければ、拡張は過度になるでしょう - > twigテンプレートでコンテナパラメータを保持する変数を追加するための 'twig.globals'の使用に関する私の答えを見てください。 – nifr

+0

@Harea Costiclaが 'AppExtension'サービスで' image_news_url'を使用しているので、これは正しい解決策でなければなりません。 –

関連する問題

 関連する問題