2012年3月23日

Yii Framework: Yiiユーザの良質なコメントをまとめてみました (解説編)

前回書いた Yiiユーザの良質なコメントをまとめてみました の解説編です。全部見ていくのは厳しい部分があるので、基本的な部分をピックアップしてみました。あと、書いていてわかったことですが、ボリュームが増えすぎるといけないなと思い Wiki コメント分はすべて省略しました。

Yii Guide

........................................................................................
Problem with Date if you have PHP 5.3
http://www.yiiframework.com/doc/guide/1.1/en/quickstart.first-app#c275

これは PHP 5.3 以上を使用している場合に予想されるタイムゾーンに関してのエラーです。「PHP 5.3 タイムゾーン」などと検索したら、解決策がたくさん出てきます。Yii の場合は /config/main.php で 'timezone' => 'Asia/Tokyo' と指定すると解決しますが、他のフレームワークなどでも同様のエラーが発生することも考えられるので php.ini で設定したほうが良いかもしれません。

参考リンク
[PHP] PHP5.3の新機能 - 日付時刻(DateTime)関連のクラスや関数

........................................................................................
Little advice
http://www.yiiframework.com/doc/guide/1.1/en/database.dao#c2729

これはテーブルプレフィックスを使用していない場合でも /config/main.php のデータベース設定箇所に 'tablePrefix' => '' を追加すると {{ tableName }} と書かれた場所でもエラーが出なくなる、というもの。例えば yii-user というエクステンションを使った場合、デフォルトでは tbl_ というプレフィックスが付いていますが、tbl_ がいらない場合にSQLの tbl_ 箇所だけ削除すればOKになります。'tablePrefix' => '' を書いていなければ、UserModule.php の tableUsers プロパティなどが {{ users }} と設定されているのでエラーが出ます。

........................................................................................
Setting nested modules
http://www.yiiframework.com/doc/guide/1.1/en/basics.module#c1746

これはモジュールの中にモジュールを作る場合の設定方法。モジュールのネストってのは、ディレクトリの階層がどんどん深くなって、わけがわからなくなりそうですが...。

........................................................................................
PDO bindParam not working for LIKE condition
http://www.yiiframework.com/doc/guide/1.1/en/database.dao#c132

これは LIKE condition を作るときには、プリペアードステートメントのところに '%' を直接書かずに、あとに書こう、というものですね。

........................................................................................
DefaultScope with dynamic table alias
http://www.yiiframework.com/doc/guide/1.1/en/database.ar#c5329

自分はこういうものを見るとわくわくします。defaultScope() は、モデルの find 系が呼ばれたときに引っ付いてくるもの。例えば上記のリンクのコメントのコードの場合、findAll() を呼ぶと SELECT * FROM `hoge` `t` WHERE t.actif =1 ORDER BY t.update_time DESC; という SQL 文ができます。例えば管理画面の親モデルでこれを書くと、各バックエンドモデルでは、常に上記のような SQL 文になるので、condition やorder コードの記述が軽減できます (actif は多分 active や status などと同様の意味と思われます) 。

参考リンク
CActiveRecord::defaultScope()
CActiveRecord::getTableAlias()

........................................................................................
Tips
http://www.yiiframework.com/doc/guide/1.1/en/database.ar#c1907

1. CActiveRecord::beforeSave() や beforeDelete() をオーバーライドする場合は、bool 値を return しなければいけない、というものです。要は true を返せば上手くいくと、いうことです。ただ問題がひとつあって、親モデル (例えば ActiveRecord.php) が存在して、かつそこで beforeSave() をオーバーライドし、子モデルでも beforeSave() をオーバーライドしている場合、true だけでは子モデルの処理しかしなくなります。子モデルでtrueした時点で処理が終わっちゃうからですが、そういう場合は、子モデルでは parent::beforeSave() を return すると親子どちらも上手く処理してくれます。

2.「1 か 0 で保存しているデータを yes と no で表示する」みたいなことはよくあるかと思いますが、そういう場合に afterFind() を利用すると、保存時に beforeSave() をオーバーライドしなければいけなくなるので、できたらビューでやろう、ってことですかね?確かに afterFind() の誘惑に誘われることがよくあります。

3, 4は翻訳できないので省略します(苦笑)

5. findAll() で取得したものは型がオブジェクトで、DAO の queryAll() は連想配列、ということですね。

参考リンク
CActiveRecord

........................................................................................
Generic Column Types
http://www.yiiframework.com/doc/guide/1.1/en/database.migration#c3879

これはマイグレーションのコードを書くときに参考になります。例えば 'hoge' => 'string' と書くと、MySQL の場合は varchar(255) に変換される、という具合です。

参考リンク
CDbSchema::getColumnType()

........................................................................................
Great feature
http://www.yiiframework.com/doc/guide/1.1/en/database.migration#c2550

これはデータベーススキーマがある場合、そのスキーマをコンソール上でダンプしてくれるものです (Yii のコアにもあってよさそうな機能なんですが... ) 。Yii 以外で作ったプロジェクトを Yii に移行するときに、いちいちマイグレーションのコードを長々と書かなくて済むので便利です。ただ、インデックス、外部キー制約は自分で書かないといけないようです。使い方としては、コードをコピペして、DumpSchemaCommand.php というファイルを作ってペーストし、/command 下に置きます。あとはコンソールで protected まで移動して yiic dumpschema データベース名 で、ずらーっとコードが出てくるので、それをコピーして、マイグレーションファイルにペーストします。 あ、あと、$this->dropTable() も自分で書かないといけないですね。

........................................................................................
User phpMyAdmin to create fixture arrays
http://www.yiiframework.com/doc/guide/1.1/en/test.fixture#c2957

これはもしデータベースにサンプルのデータを持っていれば、phpMyAdmin のエクスポートのフォーマットで PHP 配列 を指定してあげると、フィクスチャ (PHPUnit) が作れる、というものです。知らなかったので、なるほど!と思いました。

........................................................................................
yiilite and APC
http://www.yiiframework.com/doc/guide/1.1/en/topics.performance#c596

これは yiilite と APC の組み合わせは最強、ということです。APC が使えないレンタルサーバってけっこうありそうですけど...

........................................................................................

Yii API


........................................................................................
Layout for the Module
http://www.yiiframework.com/doc/api/1.1/CModule#c3283

モジュールを作ったことがある人は一度はハマる箇所だと思います。
//layouts/layout は protected/views/layouts
/layouts/layout は protected/modules/module/views/layouts
を呼び出す、ということです。

........................................................................................
Behavior in afterSave()
http://www.yiiframework.com/doc/api/1.1/CActiveRecord#c3265

これは afterSave() が完了するまで $this->isNewRecord は false にならないよ。でも $this->id で値の取得はできるよ、ってところでしょうか。CActiveRecord::insert() のコードを見れば、コードの流れがよくわかるかと思います。

参考リンク
CActiveRecord::insert()

........................................................................................
Example of usage:
http://www.yiiframework.com/doc/api/1.1/CRegularExpressionValidator#c3090

これはバリデーションで正規表現を使うときの例です。

........................................................................................
CController::id
http://www.yiiframework.com/doc/api/1.1/CController#c4276

これは CController::id と PHP の ucfirst() を利用すると、自動的にモデル名を生成できるよってことです。コントローラIDとモデル名が一致していないといけませんが、これを覚えておくことで、コードの再利用性がかなり上がります。

参考リンク
CController::id

........................................................................................
Examples of CHttpRequest properties for a given URL
http://www.yiiframework.com/doc/api/1.1/CHttpRequest#c1967

これは CHttpRequest のそれぞれのプロパティで何を取得できるか、リストにしたものです。とても見やすくありがたいですね!

........................................................................................
errorCode has predefined ERROR_ constants
http://www.yiiframework.com/doc/api/1.1/CBaseUserIdentity#c2217

CBaseUserIdentity クラスにはこんな定数が設定されている、というものです。ERROR_UNKNOWN_IDENTITY = 100; の意味が初めさっぱりわかりませんでした。というより Yii はログイン処理の流れが複雑なような気がします。今でもなんとなくの理解で、説明しろと言われてもなかなか上手く説明できません。でも、ある程度わかってくると、Yii の得意分野ですが、拡張性が優れていることがわかってきます。例えば、パスワードにストレッチング処理の機能を追加しようとしたとき、Yii ならわりと簡単にできます。CakePHP (1.3系) の場合は逆で、ログイン処理の流れはとてもシンプルですが、拡張しようと思ったら ... です。

........................................................................................
active items
http://www.yiiframework.com/doc/api/1.1/CMenu#c2351

これは zii.widgets.CMenu の items プロパティでの言及ですが、url キーに対する値は配列かつ、'/コントローラID/アクションID' と記述しないと active が正常に動作しません、というものです。例えば '/site' と書いちゃうと動作しません。しっかり '/site/index' と書かないと、今いるページがどこなのかメニューバーで判断できなくなるということです。

0 件のコメント:

コメントを投稿