2012-01-29 13 views
0

私は複数の場所に必要なこの事があります。最良の方法はやっていただきましZend Frameworkに繰り返さないためにこれを行うにはどのように自分自身

$fbLogin = new Zend_Session_Namespace('fbLogin'); #Get Facebook Session 
    if(!$fbLogin->user) $this->_redirect('/'); #Logout the user 

public function init() 
{ 
    $fbLogin = new Zend_Session_Namespace('fbLogin'); #Get Facebook Session 
    if(!$fbLogin->user) $this->_redirect('/'); #Logout the user 
} 

これらの2つの行をそれはZendFrameworkにありますか?プラグインを作成するには?私は複数の場所でそれを実行したいという意味ですが、編集する必要がある場合は、1か所で編集したいと思います。

答えて

6

コントローラから簡単に呼び出すことができるAction Helperの例を示します。

<?php 

class My_Helper_CheckFbLogin extends Zend_Controller_Action_Helper_Abstract 
{ 
    public function direct(array $params = array()) 
    { 
     // you could pass in $params as an array and use any of its values if needed 

     $request = $this->getRequest(); 
     $view = $this->getActionController()->view; 

     $fbLogin = new Zend_Session_Namespace('fbLogin'); #Get Facebook Session 
     if(!$fbLogin->user) { 
      $this->getActionController() 
       ->getHelper('redirector') 
       ->gotoUrl('/'); #Logout the user 
     } 

     return true; 
    } 
} 

これを使用するには、ヘルパーブローカーにどこに住むかを伝える必要があります。

// Make sure the path to My_ is in your path, i.e. in the library folder 
Zend_Loader_Autoloader::getInstance()->registerNamespace('My_'); 
Zend_Controller_Action_HelperBroker::addPrefix('My_Helper'); 

を次に、あなたのコントローラでそれを使用する:ここではあなたがそうするように、ブートストラップに置くことができるコード例がある

public function preDispatch() 
{ 
    $this->_helper->CheckFbLogin(); // redirects if not logged in 
} 

それは多くの詳細には触れませんが、Writing Your Own Helpersは便利です同じように。あなたは、デフォルトの代わりに延びているから、あなたもbaseControllerを設定することができ、すべてのコントローラでは、このチェックが必要な場合は

+0

フォルダ構造とは何ですか?コントローラ/アクション/ヘルパー/ My_Helper.php? – Uffo

+0

私がこの例を取っ​​たプロジェクトは、 'library/My/Helper/CheckFbLogin.php'という構造を持っています。 – drew010

+0

これを試してみていただきありがとうございます。私はZFのフォルダ構造を理解できませんでした:) – Uffo

0

class My_Base_Controller extends Zend_Controller_Action 
{ 
    public function init() 
    { ... 

class IndexController extends My_Base_Controller 
{ ... 

はベースコントローラにあなたのinit()をシフトし、あなたはすべての特定のコントローラで自分自身を繰り返す必要はありません。

init()を特定のコントローラで変更する必要がありますか?

class FooController extends My_Base_Controller 
{ 
    public function init() 
    { 
     parent::init(); 
     ... 
関連する問題