0

現在、"Keith Pope" 著の "Zend Framework 1.8 Web Application Development" を読んでいます。その中で彼は、「ActionStack」を使用して、カテゴリのトップレベル メニューのコントローラがすべてのリクエストで呼び出されるように指示しています。プラグインのソース コードは次のとおりです。

class SF_Plugin_Action extends Zend_Controller_Plugin_Abstract 
{
    protected $_stack;

    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) 
    {
      $stack = $this->getStack();

      // category menu
      $categoryRequest = new Zend_Controller_Request_Simple();
      $categoryRequest->setControllerName('category')
                      ->setActionName('index')
                      ->setParam(
                          'responseSegment', 
                          'categoryMain'
                      );

      // push requests into the stack
      $stack->pushStack($categoryRequest);
    }

    public function getStack()
    {
      if (null === $this->_stack) {
        $front = Zend_Controller_Front::getInstance();

        if (!$front->hasPlugin(
          'Zend_Controller_Plugin_ActionStack'
        )) {
           $stack = new Zend_Controller_Plugin_ActionStack();
           $front->registerPlugin($stack);
        } else {
           $stack = $front->getPlugin('ActionStack');
        }

        $this->_stack = $stack;
    }

    return $this->_stack;
  }
}

「ActionStack」プラグインのコードを読みました。「postDispatch」関数で現在のリクエストを保存し、「forward」関数で現在のリクエストのコントローラ、アクション、および設定パラメータを変更します。では、現在のリクエストはどうなるでしょうか? それはどのように実行されますか?

また、 ActionStack は悪だと聞きました。私は初心者なので、彼が(初心者のために)説明しなかったので、ほとんど理解できませんでした。なぜ ActionStack が悪なのか?

4

3 に答える 3

3

ActionStackは、ビュー関連のロジックをコントローラーに結び付けるという悪い習慣を助長するため、悪です。さらに、パフォーマンスに大きな悪影響を及ぼします。

通常、ActionStackは「ウィジェット化された」サイトを開発するために使用されます。必要なウィジェットのリストを設定し、それらを個々のコントローラーアクションにマップしてから、スタックをループします。これの設計上の欠陥は、現在N個の異なるコントローラーを実行していることです。実際に使用する必要があるのは1つのコントローラーだけです。個々のコントローラーは、着信要求を必要なビューとモデルにマップできる必要があります。代わりに、基本的にMVCトライアドを実行して、コンテンツを少し取り戻すだけです。

パフォーマンスへの影響は、以前の結果をメモリに保存してから再ディスパッチする必要があるという事実に起因します。つまり、ディスパッチ前後のすべてのプラグインを再度実行し、状態で競合が発生する可能性があります。

より良いアプローチは、モデル対応のビューヘルパーを使用することです。アクションヘルパーを使用して適切なモデルをマーシャリングし、ヘルパーを挿入してから、ビュースクリプトやレイアウトでそれらを呼び出すだけです。これは関心の分離を尊重し、同じパフォーマンスへの影響はありません。

(ZF2では、個々のヘルパーのファクトリを定義できるため、このマーシャリングははるかに簡単です。そのため、ビュースクリプトでファクトリを使用するだけで、ウィジェット化されたものを提供するためにコントローラで特別なことを行う必要はありません。コンテンツ。)

于 2012-10-15T14:17:29.387 に答える
0

それは私の最初の質問への答えです。アクション スタックは最後に (ポスト ディスパッチで) 実行されるため、現在の応答オブジェクトは、ユーザーが行った要求に対してレンダリングされたすべてのコンテンツを保持し、アクション スタックはそれにデータを追加します。したがって、ユーザーは要求したコンテンツと、アクション スタックによってレンダリングされたコンテンツを取得します。

于 2012-10-25T03:38:34.500 に答える