シェアする

  • このエントリーをはてなブックマークに追加

[CakePHP]requestActionの代わりにApp::importを使うメリット

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

  1. たしか配列自体は呼び出し先で扱えた気がしますがうろ覚え。でもエラーは出力されと思います。 []
  2. ソースを追えばもしかしたら、速い理由もわかるかもしれないですが大した差じゃないので調べるまでもないですね。 []
  3. ということはレンダリング結果以外にもプロパティで呼び出し元に値を渡せる []

シェアする

  • このエントリーをはてなブックマークに追加

フォローする