2009-05-20 16 views
24

zendフレームワークで別のコントローラのメンバ関数を呼び出すことはできますか?zendフレームワークの他のコントローラのメンバ関数を呼び出していますか?

<?php 
class FirstController extends Zend_Controller_Action { 
    public function indexAction() { 
     // general action 
    } 

    public function memberFunction() { 
     // a resuable function 
    } 
} 

ここでは別のコントローラ

<?php 
class SecondController extends Zend_Controller_Action { 
    public indexAction() { 
     // here i need to call memberFunction() of FirstController 
    } 
} 

だ私は2番目のコントローラからmemberFunctionを()にアクセスする方法を説明してください。

ソリューション

より良いアイデアのAppControllerを定義し、さらにZend_Controller_Actionのを拡張するのAppControllerを拡張するためにすべての通常のコントローラを作ることです。

class AppController extends Zend_Controller_Action { 
    public function memberFunction() { 
     // a resuable function 
    } 
} 

class FirstController extends AppController { 
    public function indexAction() { 
     // call function from any child class 
     $this->memberFunction(); 
    } 
} 

memberFunctionは、単純な継承のルールとしてAppControllerを拡張コントローラーから呼び出すことができます。

+0

をちょうどFYI私は共通の機能を必要とするとき、私は間違いなくセットアップ共有クラスまたはモジュールに好みます。しかし、ZF2を使用して1つの状況に遭遇しました。これは、他の2つのコントローラで拡張された親AppControllerを使用すると非常に役立ちます。あなたのソリューションはうまく機能しました。 ZF2では、 "クラスAppControllerはAbstractActionControllerを継承しています"と子コントローラは同じです: "クラスFirstController extends AppController"これを行うためのよりよい方法があると知っていますが、おそらくアプリの構造を再考するべきです。 – gregthegeek

答えて

24

コントローラはそのように使用するように設計されていません。あなたがあなたの現在のコントローラの後に他のコントローラアクションを実行したい場合は、_forward()メソッドを使用します。

// Invokes SecondController::otherActionAction() after the current action has been finished. 
$this->_forward('other-action', 'second'); 

注意をアクションメソッド(「memberAction」)については、この唯一の作品は、任意のないことメンバー関数!

SecondController::memberFunction()複数のコントローラー間で必要な処理を行う場合は、アクション・ヘルパーまたはライブラリー・クラスにそのコードを入れて、両方のコントローラーが互いに依存することなく共用機能にアクセスできるようにします。

+0

ありがとう@ファーディナンド、それは本当に私を助けた! – Ish

+1

UPDATE 2015:ZF 1.7から$ this - > _ forward()は廃止予定です。代わりに$ this-> forward()を使用してください。 –

+0

Hmmm、この執筆時点では、[1.12](http://framework.zend.com/manual/1.12/ja/zend.controller.action.html)のドキュメントは依然として_forward()を参照しています。しかし、あなたは正しい:このコードは '_forward'を非難されたものとして明確に示している。ありがとう! –

5

コードをアクションヘルパーまたはモデルに分解して、必要な両方のコントローラーから呼び出すことができるようにする必要があります。

よろしく、

ロブ...

+0

すばらしい答え:) – kta

3

私はDRYに従うと、共通ライブラリの場所にこれらの機能を移動するために、あなたをお勧めします。たとえば、ライブラリフォルダに

My/Util/ 

を作成し、今、あなたは内の任意の場所からそれらを呼び出すことができ、あなたのクラス

My_Util_CommonFunctions 

を呼び出して、あなたの方法

を定義

CommonFunctions.php 

を提出登録しなければならない新しい名前空間を使用しているコード。あなたが使用してカスタムメソッドを呼び出すことができます任意のコントローラで

$loader = Zend_Loader_Autoloader::getInstance(); 
$loader->registerNamespace(array('My_')); 

My_Util_CustomFunctions::yourCustomMethod($params);