2016-05-22 9 views
0

Twig拡張を使用して、以下のコードのようにデータベースからグローバル変数を渡します。しかし、私はテンプレートからTwig拡張モジュールにパラメータを渡しますか?

サービス

app.twig.database_globals_extension: 
class: Coursat\CoursatBundle\Twig\Extension\DatabaseGlobalsExtension 
arguments: ["@doctrine.orm.entity_manager"] 
tags: 
    - { name: twig.extension } 

延長

<?php 

namespace Coursat\CoursatBundle\Twig\Extension; 

use Doctrine\ORM\EntityManager; 

class DatabaseGlobalsExtension extends \Twig_Extension 
{ 

    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function getGlobals() 
    { 
     return array (
       "myVariable" => $this->em->getRepository('CoursatBundle:test')->find(##I want to pass a var here from the template##), 
    ); 
    } 

    public function getName() 
    { 
     return "CoursatBundle:DatabaseGlobalsExtension"; 
    } 

} 

テンプレート

{{ myVariable.name() }} 
... idパラメータによって、データベースからデータを取得するために、これはよりダイナミックにしたいです小枝インサイド
+0

パラメータとして 'key'を渡すことができ、' function($ key){return $ this-> getGlobals()[$ key];のようなスティッキングを行う余分なTwig_SimpleFunctionを追加します。 } ' – DarkBee

+0

こんにちは、もっと説明できますか? –

+0

私が作成した回答を参照してください – DarkBee

答えて

1

これは、データベースがあなたのウェブサイトの各呼び出しのために要求されますので、あなたのグローバルでこれを格納するために非常に悪い考えです。

あなたはそれらのデータを取得する機能を使用することができます。

<?php 

namespace Coursat\CoursatBundle\Twig\Extension; 

use Doctrine\ORM\EntityManager; 

class DatabaseGlobalsExtension extends \Twig_Extension 
{ 

    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('my_test', array($this, 'myTest')), 
     ); 
    } 

    public function myTest($id) 
    { 
     return $this->em->getRepository('CoursatBundle:test')->find($id); 
    } 

    public function getName() 
    { 
     return "CoursatBundle:DatabaseGlobalsExtension"; 
    } 

} 

その後、あなたの小枝テンプレートで、あなたのエンティティをロードするためにこれを使用する:

{% set twigVar = my_test(42) %} 

これは、しかし、まだ悪い習慣です、あなたはあなたのビューではなく、あなたのエンティティをコントローラにロードする必要があります。

+0

OMGそれは本当にamaizing :)! –

+0

こんにちは、なぜこれは悪い練習ですか?そして、データベースに格納されている「サイト名」などのグローバル変数(WordPressのような) –

+0

@ hassen-zouariが必要な場合は、ここで2つの問題があります。まず、MVCデザイン(懸念の分離)では、コントローラがデータアクセスを処理し、ビューはレンダリングされるだけです。第2に、使用されていないデータ=時間が無駄になったためにデータベースにヒットします。アプリケーションのどこか他の場所(つまり、ユーザオブジェクト)にエンティティをロードする必要がある場合、またはキャッシュされてDBコールをスキップする場合、Doctrineを使用して2番目の問題は問題になることはありません。 – davmor

1
class DatabaseGlobalsExtension extends \Twig_Extension 
{ 
    ... 
    ... 
    public function getFunctions() { 
     return array(
      'get_db_global', function($key) { 
        $globals = $this->getGlobals(); 
        return isset($globals[$key]) ? $globals[$key] : null; 
       } 
     ); 
    } 
    ... 
    ... 
} 

The global with key "Foo" is : {{ get_db_global('foo') }} 
+0

ありがとうございます。##注意:未定義の変数:キー## –

+0

そこに入力ミスがありました。 – DarkBee

+0

こんにちは、助けてくれてありがとう仲間だけど、これはうまくいきません...スカイプで連絡してください。ありがとう:) –

関連する問題