以下の記事は思い違いしている箇所があります。
slywalkerさんのblogに解説記事があるので、そちらも合わせてご覧下さい。(slywalkerさん、ありがとうございます!)
思い違いしていた点は以下。
- [変更点:1] コントローラ、モデルの命名規則
- 名前の競合
Plugin名を先頭に付けるのはシステム的な強制だと思い込んでいました。book.cakephp.orgにもありますが、これは強制ではなく、推奨ですね。
そもそもの勘違いはアクセスURLでした。↓の例だと「/admin/users/index」で、自動でadmin_users_controller.phpが読み込まれると思い込んでいました。(Routing.adminと同じノリで)なので、フレームワークがコントローラを探す際はURLから自動的にPlugin名を補完しているかと思っていました。
ここがそもそもの間違いで、アクセスURLが「/admin/admin_users/index」であれば納得です。
ということで、ここは従来のままでokということですね。
名前の競合を防ぐために、plugin名を先頭に付けるという方法が推奨されているという事でした。
昨日の勉強会で話題になっていたPluginですが、1.2RC3では仕様が変わっているようで、従来の方法で構築したPluginは動作しなくなっているようです。
変更点を調べてみました。
[変更点:1] コントローラ、モデルの命名規則
これまではPluginのコントローラ・モデルは、ファイル名とクラス名にPlugin名を先頭に付ける必要がありました。
しかしRC3の仕様では、Plugin名を付けてはいけません。
Plugin名が[admin]の場合は以下のようになります。
- 従来
app/plugins/ + [admin] + [controllers] + admin_user_controller.php (AdminUserControllerクラス) + [models] + admin_user.php(AdminUserクラス) + [views] + admin_user/index.ctp
- RC3
app/plugins/ + [admin] + [controllers] + user_controller.php (UserControllerクラス) + [models] + user.php(Userクラス) + [views] + user/index.ctp
[変更点:2] コントローラ、モデルの親クラス
さらにこれまではPluginのコントローラ・モデルの親クラスとして、%Plugin%AppController、%Plugin%AppModelクラスを定義する必要がありました。
しかしRC3の仕様では、任意となり、通常のAppController、AppModelクラスを継承してもokになりました。この場合は%plugin%_app_controller.php、%plugin%_app_model.phpを設置しなくても良いです。
もちろん従来どおり基底クラスファイルを設置して継承するのもokです。基底クラスファイルはフレームワークが自動で読み込んでくれます。
- 従来
app/plugins/
+ [admin]
+ admin_app_controller.php <== 必須
+ admin_app_model.php <== 必須
+ [controllers]
+ user_controller.php (AdminAppControllerを継承)
+ [models]
+ user.php(AdminAppModelを継承)
[/code]
- RC3
app/plugins/
+ [admin]
+ admin_app_controller.php <== 任意(なくてもok)
+ admin_app_model.php <== 任意(なくてもok)
+ [controllers]
+ user_controller.php (AppController or AdminAppControllerを継承)
+ [models]
+ user.php(AppModel or AdminAppModelを継承)
[/code]
名前が競合
仕様変更の影響ですが、まず従来の仕様で作られているPluginは当然ながら動作しません。
あと気になるのは、コントローラやモデルのクラス名からPlugin名が省かれたことにより、アプリケーション側や別のプラグインのコントローラ・モデルと名前が競合する可能性が出てきました。
複数のコントローラを一度のHTTPリクエストで読み込むことは少ないかもしれませんが、モデルに関しては十分に考えられます。あとさらに問題なのがViewテンプレートです。
app/plugin/%plugin%以下にviewsディレクトリを作る場合は問題無いのですが、app/viewsにPluginのViewテンプレートを設置したい場合は、コントローラ名がアプリケーションと競合すると、お互いが同じViewテンプレートを読み込む事になります。
@see: CakePHP1.2RC3 Plugin使用の際のViewについて – 忍び歩く男 – SLYWALKER
Pluginを作る時は競合しないようなクラス名を付ける必要がありますね。(PHP5.3ならnamespaceが使えますが。。。)
ドキュメント化されていない
この変更がいつ施されたかは追いかけていないのですが、RC3ではこのような挙動になっています。
残念ながら[2008/12/13]現在は、book.cakephp.orgのドキュメントも従来の仕様のままです。ドキュメントどおりに作ってもRC3では動作しませんので、ご注意を。
ただWebにはあまりにもこの事についての情報が無いので、ここの人が追試して「使い方間違ってるよ」的な指摘をしてくれるのを願っていたりもします。
- Newer: Python関西勉強会で発表してきます
- Older: CakePHP アプリケーション実行の流れをシーケンス図で書いてみた
コメント (Close):1
- slywalker 08-12-14 (日) 10:54
-
アンサー書きました!
http://d.hatena.ne.jp/slywalker/20081214/1229219575
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2008/12/cakephp_12rc3_plugin.html/trackback
- Listed below are links to weblogs that reference
- CakePHP 1.2RC3はPluginの仕様が一部変わってる? from Shin x blog