Hatena::ブログ(Diary)

りょうのはてな このページをアンテナに追加 RSSフィード Twitter

2011/12/02

【メモ】CakePHP 2系 でHtmlHelperを継承してオーバーライドする方法

| 04:15 | 【メモ】CakePHP 2系 でHtmlHelperを継承してオーバーライドする方法を含むブックマーク 【メモ】CakePHP 2系 でHtmlHelperを継承してオーバーライドする方法のブックマークコメント

f:id:ryo_abe:20111203012936j:image
こないだ風邪を引いたら上も下もやられました。今までの人生で一番キツかったです。。w
どうもおはようございます、こんにちわ、こんばんわ。
阿部です。
久々のブログになります。かなりサボってました。
気づけば今年も終わりですね。いかがお過ごしですか?



ここのところCakePHPでの業務が多いです

早速ですが今回は、本ブログの記事としては初めてのCakePHPについて書こうかと思います。

ここ数ヶ月、会社では上司に色々教わりながらCakePHPでの開発が多いのです。
そんな中、最近CakePHPのバージョン2系が安定版がリリースされて、会社で使ってみようということになりました。
まだまだ使い始めたばかりですが、メジャーバージョンアップ(?)ということだけあって、変更点が多いです。
公式の移行ガイド載せておきますのでもしよかったらご覧下さい。

  • CakePHP 1.3からの2.0 移行ガイド

http://book.cakephp.org/2.0/ja/appendices/2-0-migration-guide.html




CakePHP2系でハマる。。

そして今回、2系での開発の中で表題の件のHtmlHelper継承が上手く出来なくってハマりました。。
(やっと本題に入りますw)

  • 従来のCake(1.3)でのHtmlHelperの継承方法
/**
  *  app/view/helper/my.php
  *  (大本の自作ヘルパー)
  */
class MyHelper extends Helper {
	function fuga($str) {
                // 自作htmlヘルパーのインスタンス作る
		$this->Html= new MyHtmlHelper();

		return $this->Html->hoge($str);
	}
}


/**
  *  app/view/helper/my_html.php 
  *  (HtmlHelperを継承した自作htmlヘルパー)
  */
class MyHtmlHelper extends HtmlHelper {
    function hoge($str) {
        return $str;
    }
}

/**
  *  app/view/hoge/index.php 
  *  View(自作ヘルパー呼び出し)
  */
<?php echo $my->fuga('test'); ?>

ってな感じだったかと思います。
(実際に試してないので動かないかも、、)


  • これと同じようなことを2系試してみると、、
//Argument 1 passed to HtmlHelper::__construct() must be an instance of View, none given, called in ...... /app/View/Helper/MyHelper.php on line 9 and defined 

なんじゃこりゃーーーー。
HtmlHelperのコンストラクタにはViewクラスのインスタンスが必要でっせと言ってますね。

// app/View/Helper/MyHelper.php
class MyHelper extends Helper {
	public function fuga($str) {
     // ここで自分自信をViewクラスの引数に渡したインスタンスをHtmlヘルパーに渡してあげる
     $view = new View($this);
		$this->Html= new MyHtmlHelper($view);

		return $this->Html->hoge($str);
	}
}

「new View($this)」
View自信のインスタンスになるのでこれを渡してあげることで、
これで正常に動きました^^



なんでViewが必要になったのか

ちゃーんと移行ガイドに書かれてましたw

■ViewはClassRegistryに登録されなくなりました
ビューがClassRegistryに登録されることは乱用を招き、事実上グローバルシンボルを作り出していました。
2.0では各ヘルパーは現在の View インスタンスコンストラクタで受け取ります。
これはヘルパーにグローバルシンボルを作り出すことなく、以前の様式と同様にビューにアクセスさせることができます。
どのヘルパーでも $this->_View でビューのインスタンスにアクセスできます。

にゃるほどね。
だからViewからヘルパー呼ぶときに「$this->form」とかってなったのか。
あーすっきりした。
今日はじゃあこんなところで。




今年はやけに温暖な一年でしたが、もうかなり寒くなってきましたね。
チャリ通の自分は厳しい季節になってきました。
皆さん、風邪などひかぬようお体にお気を付け下さいね。

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)