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

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

Xhwlay-0.9.3をリリースしました。

Fix Xhwlay_Bookmark_FileStoreContainer's gc() bug and test case bugs.

http://sourceforge.net/forum/forum.php?forum_id=794363

Bookmarkデータファイルがいつまで経っても消えないなぁ、おかしいなぁと首をかしげてたのですが、調べてみたらBookmarkデータファイル名を"bcdata"とかにしたタイミングで、gc()でのファイル名リストアップでヒットしなくなったため、消されてなかったようです。
しかもテストケースも、ちょうどgc()のテストのとこだけ"_"付けて無効化してたし。

何の為のSimpleTestだよ、って感じ。

とりあえずバグFixアップデートでした。

リクエストMETHODを知りたい時など。

AkActionControllerには $Request という名前のメンバ変数でそのものズバリ、AkRequestクラスのインスタンスが入っています。
で、AkRequestクラス経由でリクエストMETHODとかを知ることが出来ます。

AkRequest#getMethod() でリクエストMETHODを文字列で受け取ることが出来ますが、内部的に小文字で扱っているようです。
AkRequest#isPost(), isGet()などのI/Fがありますので、通常はそちらを使った方が良いと思われます。

ActiveRecordのモデル(Model)クラスで、テーブル名を手動で調整したいとき($_tableNameメンバ変数)

えっと、Akelosのmodelのgeneratorは特にDBとか多分、見てないです。ですので、table名などは基本的にクラス名それ自体から生成している・・・筈です。すみません、AkActiveRecordのソース追ってみたのですが、正直追い切れませんでした。
getClassForDatabaseTableMapping()の中で

$class_name = get_class($this);
...
$class_name = $this->_getModelName($class_name);
...
@$this->setTableName(AkInflector::tableize($class_name), false);
...
return $class_name;

とあるので多分そうだと思うのですが・・・。

さておき、とにかく題名に対する結論としては、$_tableNameメンバ変数をオーバーライドします。

generatorで生成するmodelクラスもそうですが、AkActiveRecordクラスを継承しています。そこで、$_tableNameはデフォルトではnullになっています。その場合、AkActiveRecord#getTableName()メソッド中で前掲のgetClassForDatabaseTableMapping()が呼ばれてクラス名からテーブル名が生成されます。
というわけで、派生先のクラスで $_tableNameを初期設定しておくことで、テーブル名を手動で指定することが出来ます。

例:app/models/address_book.php :

<?php
class AddressBook extends ActiveRecord
{
    var $_tableName = 'address_book';
}
?>

といいますか、これで合ってるんでしょーか?ActiveRecordの流儀として、大体こんな感じで良いんですかね・・・?
なんかもう、Akelos側で用意してくれてるAPIとかXrefのオンラインHTMLとかも、あるのは良いのですが、文章として曖昧とか知りたい部分が無かったりして、結局ソースを読んだりしてます。JOINを使うようなSQLはADODB経由で全部SQLを自前で用意してますし・・・。

AkActionController#redirectTo()メソッドと、Viewのrendering処理について

あるURLにリダイレクトさせたい場合(Akelosの場合はデフォルトでHTTP 302 でLocationヘッダーを送出)、AkActionController#redirectTo()メソッドを使います。
ところで、redirectTo()を呼んだ後、Viewのrendering処理は発生するのでしょうか?

確かにブラウザ側としては302+Locationで、与えられたURLにジャンプすればおしまいですが、PHP側としては、302を出力したなら以降の処理はskipしたいのが正直なところです。例えばrenderingで、layoutやviewの中に、副作用を及ぼす処理が入っているかもしれませんし。

結論としては、viewやlayoutのレンダリングは行われません。もちろんcontrollerのaction中で、redirectTo()の後ろにPHPスクリプトを続けていれば実行されてしまいますが、レンダリングは実行されません。

続きを読む

どうしてもActiveRecordのモデルを使わずにADODBを直で取り出したいときのAk::db()メソッド

Ak::import()でモデルをrequireし、あとはモデルの中で getConnection() でADODBの接続インスタンスを取り出すのが普通だと思います。

しかし、それでもモデルを使いたくない。・・・モデルクラスをgenerateするのすら厭だという粋な方向けに、Ak::db()メソッドがあります。これはモデルとか一切使わず、直でADODBの接続インスタンスを取得できます。
ですので、generateするのはcontrollerまで。SQLはそりゃあ適宜クラスファイルにまとめてラップするが、とにかくActiveRecordを使いたくない。あるいは、どうしても使えない環境下においては、Ak::db()が便利です。

$con =& Ak::db();
$rs = $con->Execute(...);
...