CakePHP1.3系
requestActionを使って別のアクションのレンダリング結果を取得して、データベースに格納しようとしていた時のことです。
requestActionで問題ない場合
たとえばhogesコントローラのindexのレンダリング結果を取得したい場合、呼び出し元のアクションで次のように書けます。
$post = $this->requestAction(array( "controller" => "hoges", "action" => "index", ), array( "pass" => array( // 引数 "引数1", "引数2", ), "return", // これをしておくと実際にレンダリングされない(だったと思う) ));
これで$postにレンダリング結果が入ります。
引数が配列の場合は?
困ったのが、hoges/indexに渡したい引数が配列の場合です。
requestActionのpassに配列を渡すとNoticeエラーが出力されてしまいます。*1
呼び出し先で配列自体は扱えるのですが、router.phpの_writeUrlメソッドを通るときにpassをimplodeしようとするためにエラーとなるようです。
このまま使うのはちょっと気持ち悪いですよね。
そこでApp::import
そこでApp::importでhogesコントローラを呼び出して使うことにしました。
App::import("Controller", "Hoges"); function 呼び出し元() { $HogesController = new HogesController; $post = $HogesController->index(array("引数1-1", "引数1-2"), array("引数2-1", "引数2-2")); }
ばっちり取得出来ました。ソースも心なしか清々しい。
エラーが出ないほか、呼び出し先のコントローラで定義しているクラス変数にもアクセスすることができます。
// 呼び出し元から呼び出し先のクラス変数(コントローラのプロパティ)を取得できる pr($HogesController->property);
さらに・・・
ベンチマークを取った結果、ほんのわずかながらApp:importの方が速い・・・きがします(笑)
0.0何秒の違いで、ソースを追ったわけでもないので眉唾ですがσ(^_^; )*2
追記
そういえば、この方法の場合は呼び出し先でrenderしてやる必要があります。autoRenderが効かないので注意してください。
// 呼び出し先 return $this->render("index"): // actionも指定しないとだめ。
まとめ
requestActionの引数に配列を渡すとエラーがでるので、App::importがおすすめ。
App:importを使うメリット
・引数に配列を渡してもエラーがでない
・呼び出し先のプロパティを取得できる。*3
・もしかしたら速いかも!?
でもぶっちゃけ大した違いじゃないのでどっちでもいいと思います。
最後まで読んでくださった方ごめんなさい(m´・ω・`)m