忍び歩く男 - SLYWALKER

大阪のこっそりPHPer

CakePHP 1.2RC3はPluginの仕様が変わってるのアンサー

CakePHP 1.2RC3はPluginの仕様が変わってる | Shin x blog
のアンサーなんですが、

[変更点:1] コントローラ、モデルの命名規則について

これまではPluginのコントローラ・モデルは、ファイル名とクラス名にPlugin名を先頭に付ける必要がありました。

しかしRC3の仕様では、Plugin名を付けてはいけません。

プラグインを使い出したのがRC3(さらに今はNightly版を使っているの)で、従来の部分がよくわらなかったりしますが・・・
プラグインへのアクセスURLの表記がなかったので、ちょっと外してるかもしれません><
今回のフォームメールプラグインの例でいいますと、

Plugin名: FormMail[form_mail]
管理画面: 
    アクセスURL: /admin/form_mail/form_mail_forms
    呼び出されるコントローラ:
        app/
            plugins/
                form_mail/
                    form_mail_forms_controller.php
                      の function admin_index()  

表示画面: 
    アクセスURL: /form_mail/form_mail_forms/view/{id}
    呼び出されるコントローラ:
        app/
            plugins/
                form_mail/
                    form_mail_forms_controller.php
                      の function view($id)  
|

上記のURLで問題なく動作するので、コントローラ名の競合を避けるためにも、今までの命名規則は守った方がいいように思います。
長ったらしいURLになってしまいますが、最終的に app/config/routes.php で整理すればいいやと思っています。

[変更点:2] コントローラ、モデルの親クラスについて

さらにこれまではPluginのコントローラ・モデルの親クラスとして、%Plugin%AppController、%Plugin%AppModelクラスを定義する必要がありました。

しかしRC3の仕様では、任意となり、通常のAppController、AppModelクラスを継承してもokになりました。この場合は%plugin%_app_controller.php、%plugin%_app_model.phpを設置しなくても良いです。

もちろん従来どおり基底クラスファイルを設置して継承するのもokです。基底クラスファイルはフレームワークが自動で読み込んでくれます。

もちろん、AppController、AppModelクラスを継承してもokなんですが、なるべくプラグイン内で機能を完結すると言う意味で、自分は%plugin%_app_controller.php、%plugin%_app_model.phpの設置を推奨します。
例えば、今までapp層で作っていたアプリをプラグイン化する際に、app_controller.phpやapp_model.phpに何らかの処理を記述していた場合、そのままにしてしまうと、app層に依存したプラグインになってしまうので、プラグインフォルダのコピーで再利用といった手軽さが失われてしまいます。
もちろん、移せない事情等ある場合もありますが、自分は極力プラグインフォルダ単体で動くようにしています。

考え方としては、

  • plugin層: 個別機能の処理を書く
  • app層: 個別機能を組み合わせた処理を書く、または各Pluginで共通に使用する処理を書く

といった感じです。

Pluginで共通に使用する処理をapp層に書いたら、Pluginがappに依存しまくりじゃねーか!って矛盾がでてきますが、あくまでもDRYな方向で個人のさじ加減でお願いします。
自分の例では、自分用のPaginatorHelperをすべてのviewで使いたかったので、app/views/helpers/my_paginator.php としてたりします。
あと、そのプラグインでしか使わないコンポーネント・ヘルパー・ビヘビアがあれば、プラグインの中に入れてます。

なにか齟齬があれば、また突っ込んでください(;^ω^)