Home > CakePHP | PHP > CakePHP 1.2RC3はPluginの仕様が一部変わってる?

CakePHP 1.2RC3はPluginの仕様が一部変わってる?

この記事の所要時間: 317

以下の記事は思い違いしている箇所があります。

slywalkerさんのblogに解説記事があるので、そちらも合わせてご覧下さい。(slywalkerさん、ありがとうございます!)

思い違いしていた点は以下。

  1. [変更点:1] コントローラ、モデルの命名規則
  2. Plugin名を先頭に付けるのはシステム的な強制だと思い込んでいました。book.cakephp.orgにもありますが、これは強制ではなく、推奨ですね。

    そもそもの勘違いはアクセスURLでした。↓の例だと「/admin/users/index」で、自動でadmin_users_controller.phpが読み込まれると思い込んでいました。(Routing.adminと同じノリで)なので、フレームワークがコントローラを探す際はURLから自動的にPlugin名を補完しているかと思っていました。

    ここがそもそもの間違いで、アクセスURLが「/admin/admin_users/index」であれば納得です。

    ということで、ここは従来のままでokということですね。

  3. 名前の競合
  4. 名前の競合を防ぐために、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にはあまりにもこの事についての情報が無いので、ここの人が追試して「使い方間違ってるよ」的な指摘をしてくれるのを願っていたりもします。

Pocket

follow us in feedly

コメント (Close):1

slywalker 08-12-14 (日) 10:54

アンサー書きました!
http://d.hatena.ne.jp/slywalker/20081214/1229219575

トラックバック:0

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2008/12/cakephp_12rc3_plugin.html/trackback
Listed below are links to weblogs that reference
CakePHP 1.2RC3はPluginの仕様が一部変わってる? from Shin x blog

Home > CakePHP | PHP > CakePHP 1.2RC3はPluginの仕様が一部変わってる?

検索
フィード
メタ情報

Return to page top