21

ユーザーセッションに関連付けたいエンティティがあります。どこからでもこの情報にアクセスできるように、サービスを作成しました。

サービスでは、エンティティIDをセッション変数に保存し、getEntity()メソッドではセッション変数を取得し、教義でエンティティを見つけて返します。

この方法でテンプレートを呼び出すことができるはずです{{ myservice.myentity.myproperty }}

問題は、myservice がいたるところで使用されていることです。Action 以降、毎回取得してビュー配列に追加する必要はありません。

セッションのようなすべてのビューからサービスにアクセスできるようにする方法はあります{{ app.session }}か?

4

2 に答える 2

49

ソリューション

カスタムサービスを作成することで、どこからでもアクセスできます

$this->get('myservice');

これはすべてhttp://symfony.com/doc/current/book/service_container.htmlによって行われます

ただし、デモコードをいくつか示します。

サービス

この最初のスニペットは実際のサービスです

<?php
namespace MyBundle\AppBundle\Extensions;

use Symfony\Component\HttpFoundation\Session;
use Doctrine\ORM\EntityManager;
use MyBundle\AppBundle\Entity\Patient;

class AppState
{
    protected $session;
    protected $em;

    function __construct(Session $session, EntityManager $em)
    {
        $this->session = $session;
        $this->em = $em;
    }

    public function getPatient()
    {
        $id = $this->session->get('patient');
        return isset($id) ? $em->getRepository('MyBundleStoreBundle:Patient')->find($id) : null;
    }
}

config.ymlこのようなものであなたに登録してください

services:
    appstate:
        class: MyBundle\AppBundle\Extensions\AppState
        arguments: [@session, @doctrine.orm.entity_manager]

前に言ったように、コントローラーでサービスを取得できます

$this->get('myservice');

しかし、これはグローバルなサービスであるため、すべてのコントローラーとすべてのアクションでこれを行う必要はありませんでした

public function myAction()
{
    $appstate = $this->get('appstate');
    return array(
        'appstate' => $appstate
    );
}

Twig_Extension を作成します

小枝拡張

<?php
namespace MyBundle\AppBundle\Extensions;

use MyBundle\AppBundle\Extensions\AppState;

class AppStateExtension extends \Twig_Extension
{
    protected $appState;

    function __construct(AppState $appState) {
        $this->appState = $appState;
    }

    public function getGlobals() {
        return array(
            'appstate' => $this->appState
        );
    }

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

}

依存性注入を使用することで、appstate という名前の twig 拡張機能で作成した AppState サービスができました。

これを symfony に登録します (ここでもservices構成ファイル内のセクション内)。

twig.extension.appstate:
    class: MyBundle\AppBundle\Extensions\AppStateExtension
    arguments: [@appstate]
    tags:
        - { name: twig.extension }

重要な部分は「タグ」です。これは、symfony がすべての twig 拡張機能を見つけるために使用するものであるためです。

これで、小枝テンプレートで appstate を変数名で使用するように設定されました

{{ appstate.patient }}

また

{{ appstate.getPatient() }}

素晴らしい!

于 2011-10-05T08:04:42.817 に答える
2

多分あなたはあなたの行動でこれを試すことができますか?: $this->container->get('templating')->addGlobal($name, $value)

于 2011-10-04T17:13:05.410 に答える