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

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

Helper中などでModel(ActiveRecord)クラスを手動でrequireしたい時

手動で、特定のモデルを取り込みたい(例えばControllerとは関係のないテーブルのActiveRecordを使いたい)時は、Ak::import()が使えます。引数指定も柔軟で、二つ以上のモデルを取り込みたい(requireした)場合は、配列で見たまんま渡しても良いですし、内部実装はfunc_get_args()使ってくれてますので怠惰に可変長引数で渡しちゃっても平気です。

Ak::import('User');
Ak::import(array('User', 'Group'));
Ak::import('User', 'Group');

$User =& new User();

ちなみにAkActionController::instantiateModelClass()は使わない方が良いかも・・・。中で勝手にfind()のidとか取得したりしてごちゃごちゃしてくれちゃうので、自分のようにアンチActiveRecord派は精神衛生上悪いから・・・。

そう。ようやく何で苛つくのか分かった。自分、ActiveRecordに馴染めないオールドタイプだからだ・・・。
ええ、1/3倍の速さでしょうね。

Helper中でコントローラにアクセスしたい時

generatorを使ってcontrollerだけを生成すると、helperも一緒に生成してくれるのは良いのですがAkActionViewHelperを継承してくれません。このため、$this->_controllerが使えないです。

例:

DOS> php .\script\generate Hoge
The following files have been created:
C:\...\app\controllers\hoge_controller.php
C:\...\app\helpers\hoge_helper.php
C:\...\test\functional\controllers\hoge_controller.php
C:\...\test\fixtures\app\controllers\hoge_controller.php
C:\...\test\fixtures\app\helpers\hoge_helper.php

hoge_helper.php の中身 :

<?php

class HogeHelper
{
}

?>

なんで、ここに適当なメソッドつけて

class HogeHelper {
    function hoge() {
        $this->_controller->...

とやってみたら、「"_controller"なんてメンバ変数定義されてないよ」と怒られたんですね。「Fatal error: Call to a member function on a non-objec」です、ハイ。

というわけで、generatorでcontroller単体だけ生成したときのhelper内でcontrollerを使いたくなったら、AkActionViewHelperを継承させないと駄目みたいです。

class HogeHelper extends AkActionViewHelper
{
...

これでおけ。