ミニメモ

  • View関連
    • ViewRendererを使っていると、特別な処理をしないかぎり、どのアクションコントローラーでも同じviewインスタンスを使用する。ViewRendererのinitViewの最後の処理でセットされている。
      • Viewに対して参照でモデルを投入する際は、コントローラー間の意図せぬ流出に気をつける必要がある。
      • ActionController::_forwardやActionStack使用時、前のアクションのデータを残したくなければ、clearVarsしておく必要がある
      • ActionStackや_forwardで、レスポンスオブジェクトのセグメントを直接指定することはできないが、ViewRendererにはsetResponseSegmentがあるので、レンダリング結果の振り分けには使える。
    • ViewRendererを使わない場合は自前でviewオブジェクトを作るので、個別の設定になる。
  • アクションヘルパーについて
    • アクションヘルパーのヘルパーブローカーは、各アクションコントローラーにつき一つのインスタンスが作られる。(違うのはコントローラーだけなので、シングルトンでコントローラーを切り替えても同等だと思うんだが)
    • ブローカー内のスタックはスタティックなので、ヘルパーはすべてのアクションコントローラーで同じインスタンスを利用することになる。したがって、あるコントローラーで与えたオプションは別のコントローラーでも適用されるので、オプションを保持させるようなヘルパーを作るときは要注意。
    • 同様に、デフォルトではヘルパーブローカーのプラグインローダーもスタティックなので、プラグインローダーでスタティックレジストリを切り替えることによるヘルパーインスタンスの使い分けはできない。
  • ルーターについて
    • Zend_Controller_Router_Route_Chainでのルートの渡し方
      • ルーターにルートを渡す際、$route->chain($innerRoute)のように、chainメソッドの返りオブジェクトを渡さなければいけないと、マニュアルにある。chainしてから$routeを渡すというのはNG。また、チェーン内のルートには完全一致しないとチェーンにマッチしたとは判断されない。chainルートを作成してaddRouteした方が割り切ってていいと思うんですが・・・
  • リクエストオブジェクト
    • ルーターでモジュール、コントローラー、アクションがリクエストオブジェクトにセットされた時には、リクエストオブジェトの_paramsに登録される。しかし、アクションコントローラー内でリクエストオブジェクトに対して、setControllerName等でセットしても、_paramsの中身は変更されない。リクエストオブジェクト内の_controller _module _actionが変更される。ただし、actionに関しては、Nullを与えることで_params内のアクション名を消去できる。

※アクションヘルパーがコントローラー間のカップリングに影響してしまうのは、やや疑問。知っていれば問題はないが。

このエントリーには随時、追加および削除していきます。