ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

elementの中やViewの中で、直接リクエストパラメータに触るには

いえ、一番確実なのはそりゃあ、コントローラの中でsetするのが正しいのは知ってますよ?でも、なんでもかんでもそうしなければならないという原理主義は現場の人間には少し窮屈ざんす。

例によりバージョンは 1.1.19 です。

まずviewやelementの中で使われる $this というのは、CakePHPのViewクラスのインスタンスであることがポイントその1.
ということは、

${app}/views/hogecon/hoge.thml : 
...
<?php echo $this->renderElement(...); ?>
...

の$thisも、さらにここでrenderElementで取り込まれるelementの中の $this も一緒のものを指してます。

次、ポイント2.

http://api.cakephp.org/class_view.html
とか見ていただけると、public attributeとしてコントローラとよく似たメンバが多数見かけられます。実際Deprecatedになっていますが、'controller'自体も見受けられます。

実際のCakePHPのview.phpを見ていただければ分かりますが、$_passedVars というprotectedなメンバに、controllerから引き継ぐメンバ名が配列で入っていて、Viewクラスのコンストラクタでcontrollerのインスタンスの参照を引数で受け取ってますので、ぐるぐるループで回してViewにコピーしてます。つまり、その辺りはcontrollerのものがそのまま扱えると考えて良さそうです。

cake/libs/view/view.php :

<?php
...
/**
 * List of variables to collect from the associated controller
 *
 * @var array
 * @access protected
 */
var $_passedVars = array('viewVars', ..., 'plugin');
...
function __construct(&$controller) {
  ...
  $this->controller =& $controller;
  $c = count($this->_passedVars);
  for ($j = 0; $j < $c; $j++) {
    $var = $this->_passedVars[$j];
    $this->{$var} = $controller->{$var};
  }
...

というわけで、elementの中でリクエスト値を見たいときは、controllerと同様にdataやparamsにアクセスして見ることができます。

それにしても、なんでcontrollerがdeprecatedになっちゃったんでしょうか・・・。contextみたいなクラスをsingletonで用意しておいて、そこからgetController()で取り出せるようになってれば・・・いや、まぁ良いんですけど。