web-dev-qa-db-ja.com

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を定義し、すべての通常のコントローラーを作成してAppControllerを拡張し、Zend_Controller_Actionをさらに拡張することです。

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を呼び出すことができます。

24
Ish

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

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

これはアクションメソッド(「memberAction」)でのみ機能し、任意のメンバー関数では機能しないことに注意してください。

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

25
Ferdinand Beyer

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

よろしく、

ロブ...

5
Rob Allen

DRYに従って、これらの関数を共通のライブラリの場所に移動することをお勧めします。たとえば、ライブラリフォルダに作成します。

My/Util/ 

とファイル

CommonFunctions.php

次に、クラスに電話します

My_Util_CommonFunctions

メソッドを定義します

これで、登録する必要のある新しい名前空間を使用して、コード内の任意の場所からそれらを呼び出すことができます。

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

どのコントローラーでも、以下を使用してカスタムメソッドを呼び出すことができます。

My_Util_CustomFunctions::yourCustomMethod($params);
3
Mike Walkowiak