2017-11-15 9 views
0

Symfony 3.4では、base.html.twig現在のユーザのメッセージの番号を表示するnavbarがあります。私はこれを行うためにリポジトリエンティティ関数を使用します。この関数はテンプレートbase.html.twigがレンダリングされるたびに呼び出される必要がありますが、この関数をすべてのコントローラに配置したくない場合は、base.html.twigをレンダリングする前にイベントリスナーでこれを行う方法を教えてください。ベースコントローラーをオーバーライドしますか?symfonyレンダリング前にリポジトリ機能を追加するbase.html.twig

base.html.twig : 
    .... 
    {{ include top_bar_nav.html.twig }} 
    .... 
+2

これは厳密にレンダリングするためのものなので、最初に選択するのはおそらくカスタムtwig拡張を書くことです:https://symfony.com/doc/current/templating/twig_extension.html – Cerad

+0

私はそう言うでしょう前のイベントリスナーbase.html.twigをレンダリングします。あなたはフランス人だそうです。 openclassroomチュートリアルを見てください。チュートリアルのこのページは、あなたが必要としているものとまったく同じようです。 https://openclassrooms.com/courses/developpez-votre-site-web-avec-le-framework-symfony2/le-gestionnaire-d-evenements-de-symfony2 – Mz1907

+0

はい私はフランス人で、はいopenclassroomsはとても良いですしかし私は私の問題のための道を見つけませんでした。ドキュメンテーションはとても大きく、私はsymfonyを使い始めました。 –

答えて

1

カスタム小枝の拡張子が正しい方法である:小枝で

例:

<?php 

namespace AppBundle\Twig; 

use Doctrine\ORM\EntityRepository; 

class UserExtension extends \Twig_Extension 
{ 
    /** 
    * @var EntityRepository 
    */ 
    private $userRepository; 

    /** 
    * @param EntityRepository $repository 
    */ 
    public function __construct(EntityRepository $repository) 
    { 
     $this->userRepository = $repository; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('number_of_current_users', array($this, 'numberOfCurrentUsers')), 
     ); 
    } 

    /** 
    * @param $sku 
    * 
    * @return string 
    */ 
    public function numberOfCurrentUsers() 
    { 
     return $this->userRepository->getNumberOfCurrentUsers(); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getName() 
    { 
     return 'user'; 
    } 
} 

とこのようにそれを登録します。

{{ number_of_current_users() }} 

は、このような小枝の拡張機能を作成します。

app.twig.users: 
    class: AppBundle\Twig\UserExtension 
    arguments: ['INJECT YOUR USER REPOSITORY HERE'] 
    public: false 
    tags: 
     - { name: twig.extension } 
+0

あなたの良いソリューション、反応性とサンプルコードをありがとう!同時に私はトップバー用のコントローラーを使ってインクルードを使わずに、twigテンプレートでコントローラーをレンダリングするために質問しています。https://symfony.com/doc/current/templating/embedding_controllers.html。についてどう思いますか ? –

+0

解決策もうまくいきますが、ESIについては以下のように考えてください:http://symfony.com/doc/3.4/http_cache/esi.html – OskarStark

+0

ESIはクールですが、ダッシュボードの動的アプリケーションなので、キャッシュはよく使用されないと思います。私はユーザーのコンテキストでトップバーの中にたくさんのことをするので、コントローラソリューションを選択します。良い一日と感謝します。 –

関連する問題