2012-03-27 6 views
1

私はzfアプリケーション内でセッションを使用する最良の方法を探しています。コントローラでそのセッションがこのように使用された後コントローラーだけでなくアクションヘルパーも使用できますか?

class Vovkin_Controller_Action extends Zend_Controller_Action 
{ 
    protected $_session; 

    public function init() 
    { 
     // here I define namespace 
     // ... 
     $this->_session = new Zend_Session_Namespace($nameSpace); 
     parent::init(); 
    } 
    ... 
} 

public function someAction() 
{ 
    $this->_session->user = $user; 
} 

が、私はこれを見つけたコントローラスーパークラスの方法は、私がセッションを初期化のinitに - は、まず私はこのような何かをしました私は他の方法でセッションを初期化しなければならなかったので、プラグイン、サービスなどのシステムの他の部分にはあまり便利ではありませんが、可能ならばそれを1つの場所に保存します。だから私はこのアプローチに変更することを決めたhttps://stackoverflow.com/a/2506447

今、私は別の名前空間とのセッションへのアクセスを提供するために、いくつかのアクションヘルパーを持っている、それは次のように動作します。

public function someAction() 
{ 
    $this->_helper->session()->user = $user; 
} 

と私は他の部分でのセッション名前空間へのアクセスを得ることができるので、これまでのところ、それは、便利になりますシステムの、例えばサービスでは、このように:

class Vovkin_Model_Service_UserLoginService 
{ 
    public function login() 
    { 
     $session = Zend_Controller_Action_HelperBroker::getStaticHelper('session')->direct(); 
     ... 
    } 
    .... 
} 

しかし、どのくらいのアーキテクチャと使用資源の観点から、この方法でそれを使用するのが正しいのか?

ありがとうございました。

+0

私の意見、ちょうど 'Zend_Registry'を使用しています。 –

答えて

2

あなたが主張した答えは、Zend Frameworkの主な貢献者の1人であるRob Allenです。これはある程度正しいです。コントローラ上のアクションヘルパーと一緒に問題なく移動できます。

しかし、それ以外は完全に間違っています。サービスは、アクションヘルパーとフロントコントローラとは何も持っていません。あなたはそれに依存することはできません(アクションヘルパーへのサービス)。

したがって、アプリケーションのブートストラップはアプリケーションを初期化するためのコンテナとして機能するため、そこから必要な値を取得するのが妥当です。まず、Zend_Registryを使用することをお勧めします。しかし、私が教えている限り、それはワイプされないので、セッションオブジェクトを再び初期化するのと同じであろう。それはネイティブの$_SESSION超球体を参照するオブジェクトに過ぎない。したがって、単に

new Zend_Session_Namespace($nameSpace)と電話するだけです。

もう一度、これは間違っています。あなたは、あなたのサービスが(したがって内部のオブジェクトを作成する)セッションを処理する方法を知っているべきではありません。

$session = Zend_Controller_Action_HelperBroker::getStaticHelper('session')->direct() 

、あるいはそれと

$session = Zend_Registry('userSession')

または

$session = new Zend_Session_Namespace('userSession')

ブートストラップコンテナをまったく使用していません。代わりに、セッション($ _SESSIONやデータベースさえあれば)を扱うための共通のインターフェースを用意し、パラメータとしてサービスに注入する必要があります(例えば__construct($session))。しかし、それはまったく新しい主題(Dependency Injection)です。だから、

1)あなたは、コントローラを介してサービスを使用します:

だから、あなたは(それはすでに古いと悪い慣行のフルです)ZendFramework 1.11の現在の状態を考慮し、2つのオプションがありアクションヘルパーを介してセッションを取得し、それをパラメータとしてサービスに渡します。

new Vovkin_Model_Service_UserLoginService($session) 

2)あなたは、独立して、コントローラのサービスを使用すると、ブートストラップコンテナを通じて依存関係を取得します:

さて、最悪の事態は、それはあなたがfrontController依存関係を持っている必要があり、ブートストラップを取得することです。

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); 

ですから、それを避けて、最初のオプションを使用して、依存関係を注入してください。あなたが本当にそのようにそれをしたい場合は、ものの、直接アクセスして:

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); 
$bootstrap->get('userSession') 

悲しいことは、最終的に、それは間違っているすべてのものです。しかし、あなたがZF 1でできることは最高です。これらの概念をよりよく理解するには、ZF 2とSymfony 2を楽しみにしていなければなりません。

ここで、それは良い説明です:http://symfony.com/doc/current/book/service_container.html (私はあなたがZFを使用していることを知っているが、それは問題ではない、という概念が鍵となります)

+0

ありがとうございます!あなたの偉大な答えだけでなく、この答えの後、最終的にDIを深く研究することにしたので、2日後にSymfony2 Service Containerを使ってすばらしいソリューションになりました!たぶんそれはただの感情なのかもしれませんが、最初の印象は印象的です。 – Vovkin

+0

私はそれを聞いてうれしい=) –

関連する問題