0

5 つのコントローラーを介してレンダリングされる 10 ページで構成される symfony2 Web プロジェクトがあります。ユーザーは、上記のどのページからでも (共有リンクなどを介して) サイトにアクセスできます。position:absoluteそして、現在のセッションで初めてページを開いたユーザーにウェルカム ポップアップ ( の div のみ) を表示する必要があります。

必要なすべてのページで使用される共通の小枝テンプレートにポップアップを既に配置しました。ここで、ポップアップを表示するかどうかを決定する必要があります。コントローラーからのブール値に基づいてポップアップを表示します。

セッションと Cookie を操作する必要がありますが、各ページでそれを行う必要があり、各コントローラーのすべてのメソッドで同じコード (Cookie を確認して設定し、ブール値を出力してテンプレートにポップアップを表示する) を記述したくありません。 . DRYの概念に従ってこれを行う方法はありますか?

4

2 に答える 2

1

現在のセッション値のチェック、設定、および取得を処理するラッパー クラスを作成し、それをサービスにすることができます。

<?php

namespace My\Bundle\My\Namespace;

use Symfony\Component\HttpFoundation\Session\Session;

class SessionManager /* or whatever you want to call it */
{

  public function __construct(Session $session)
  {
    $this->session = $session;
  }

  public function getMyValue()
  {
    return $this->session->get('my.value.key',null);
  }

  public function setMyValue($value)
  {
    $this->session->set('my.value.key',$value);
    return $this;
  }
  public function hasMyValue()
  {
    return $this->session->has('my.value.key');
  }
}

そして、バンドルの services.yml で

<service id="mytag.session_manager" class="My\Bundle\My\Namespace\SesionManager">
    <argument type="service" id="session" />
</service>

そしてあなたのコントローラーで

public function someAction()
{
   $sessionManager = $this->get('mytag.session_manager');

  if($sessionManager->hasMyValue())
  {
    // do something
  }
}
于 2013-04-19T16:01:05.863 に答える
0

Sgoettschkes の回答のおかげで、symfony2のすべてのページに共通のビジネス ロジックを配置する場所http://symfony.com/doc/current/book/templating.html#embedding-controllers を試しまし た。

そして、それはすばらしく見えます: My Popup は、このようにメイン テンプレートに含まれています

{{ render(controller('MalyutkaMainBundle:WelcomePopup:index')) }}

コントローラー内よりもセッション変数を操作します

class WelcomePopupController extends Controller {
    public function indexAction(Request $request) {
        $session = $this->get('session');

        $showWelcomePopup = 0;

        if ($session->has("have_seen_welcome_popup_on")) {
            // tbd compare to the date of publishing of the new popup screen 
        } else {
            $showWelcomePopup = 1;
            $session->set("have_seen_welcome_popup_on", new \DateTime());
        }

        $params = array (   
            'show_welcome_popup' => $showWelcomePopup
        );

        return $this->render('MalyutkaMainBundle:WelcomePopup:welcome_popup.html.twig', $params);
    }
}

そして、他のコントローラーに何も追加する必要はありません-私がやりたかったことだけです。しかし、そのように Cookie を変更することは不可能なので、データをセッションに保存します。

于 2013-04-19T16:58:19.660 に答える