0

私が開発しているACLモジュールのモジュールコントローラーとアクションの配列を取得しようとしています。まだフレームワークを学習しており、オートローダーまたはブートストラップから保存される場所から情報を取得しようとしています。必要がなければ、追加のリクエストを削減しようとしています。最終出力に必要なものの例を次に示します。

  • アプリケーション(モジュール)
    • IndexController
      • ViewAction
      • EditAction
      • DeleteAction
  • ZfcUser(モジュール)
    • UserController
      • IndexAction
      • LoginAction

どんな助けでも大歓迎です。私はファイルのディレクトリをスクレイピングしてメソッドのクラスをチェックすることに反対していませんが、よりクリーンなソリューションを望んでいました。

4

2 に答える 2

3

特定のリクエストに対して、実際にメモリにロードされるコントローラは1つだけである必要があります(forward()などを使用する場合を除く)。これは、ControllerManagerからルーティングされた特定のコントローラーインスタンスをプルして、その1つのインスタンスを提供するためです。

すべてのコントローラーのリストが必要な場合は、ControllerManagerサービスをイントロスペクトできます。そのプラグインマネージャーの実装はServiceManagerを拡張するため、メソッド「getRegisteredServices()」を呼び出すことができます。このメソッドは、サービスタイプごとにサービス名のリストを提供します。そこから、それぞれをループして各コントローラーを取得できます(サービス名はクラス名と1:1の関係にない場合があるため)。

それはあなたにコントローラーを手に入れます。

アクションの場合、それは実装によって異なります。コントローラがAbstractActionController実装の場合、クラスでReflectionを使用してメソッドのリストを取得すると、「Action」で終わるメソッドはすべてアクションになります。AbstractRestfulController実装の場合、これも当てはまりますが、getList、get、create、update、およびdeleteメソッドもあります。最後に、コントローラーは単にZend \ Stdlib\DispatchableInterfaceを実装するオブジェクトであることを忘れないでください。そのため、「アクション」の概念は必ずしも適切ではない場合があります。(例として、dispatch()のみを定義する多数の「ページ」コントローラーとサービスエンドポイントを構築しました。)

于 2012-09-17T20:08:37.070 に答える
1

このコンポーネントを使用して、必要なものを取得できます:Zend \ Code、これは開始に役立つ例です:

public function testGetAllRessources() {
    $sc = new DirectoryScanner();
    $sc->addDirectory('Path/to/Your/Module/src/Module/Controller/');
    $sc->addDirectory('Path/to/Your/SecondModule/src/SecondModule/Controller/');
    foreach ($sc->getClasses(true) as $classScanner) {
        $classname = $classScanner->getName();
        echo 'Controller: ' . $classname . PHP_EOL;
            foreach ($classScanner->getMethods(true) as $method) {
                if($this->endsWith($method->getName(),'Action')) {
                        echo 'Action: ' . $method->getName() . PHP_EOL;
                }
        }
    }
}

function endsWith($haystack, $needle) {
    $length = strlen($needle);
    if ($length == 0) {
        return true;
    }
    return (substr($haystack, -$length) === $needle);
}
于 2013-04-21T12:01:25.440 に答える