細かすぎて伝わらないCakePHP Pluginシリーズ "Setting plugin" #cakeadvent2012 Day13

CakePHP Advent Calendar 2012 13日目の記事です。

12日は@Ugatsさんの「どこからCakePHPを使えるといっていいのか。」でした。

個人的には、(以前からPHPで開発されていた方限定ですが)「CakePHPを使って便利だなと思えたら使えている」んではないかと思っています。

さて、今年2回目の登場なわけですが、日ごろエントリーを書いていないのでこういうときに書かないとCakePHP界隈から忘れさられてしまいそうなので。

日ごろエントリーを書かなかったからといって、別にプログラムも書いていなかったわけではなく、ガシガシCakePHPで書いています。

最近はzenpreも開発版リリースということでCakePHPでのリニューアルを進めており(以前はRails)、受託案件と並行して楽しい開発ライフを送っています。


CakePHPも既に枯れたフレームワークで、開発効率最高潮か!?」というとそうでもなく、自分はいまだにプラグインやライブラリを作ることがあります。

で、紹介エントリーを書かないでTwitterでつぶやくだけだったりするので、だいたい自分のGitHubリポジトリに埋もれていますが「使っていない」わけではなく、かなり活用をしていたりします。

というわけで、今回は「細かすぎて伝わらないCakePHP Pluginシリーズ」と銘打って、自作の細かいプラグインを紹介したいと思います。

今回はSetting pluginです。

(「シリーズ」とありますが、シリーズ化するかは分かりません)

Setting plugin


Setting: Database driven setting plugin for CakePHP


このプラグイン、細かいです。何が細かいかというと「便利と思われるシチュエーション」が細かいです。

1.設定値の管理どうしている?

皆さんは、普段システム開発をしていて「設定値」をどう管理していますか?

例えば「パスワードの長さ」とか「メールのfrom

などなど。

まあ、開発当初は「ずっと変わらないから」という理由でソースコードに書きますよね?自分は書きます。

2.小さな仕様変更

で、運用を開始して良くあるのが 「やっぱりパスワードの長さは6文字じゃなくて8文字で」とか 「fromのメールアドレス変わりましたー」とか いうような「細かい」仕様変更。

細かいんだけど、プログラムの修正とデプロイが必要になってしまうという。追加工数をもらうようなものではないんだけど、確実に時間がかかる。

で、まあここまではよいと思います。

3.設定変更画面が欲しい

やっぱりいろいろな設定を画面から自由に変更できるほうがいいよね

。。。

。。

いろいろ凹みます。

まさにこのタイミングで「Setting pluginで設定値管理していて良かった!」となるのです!(細かい)

Setting pluginの仕組み

簡単です。要は、設定値関係をデータベースに保存する形で管理しているだけです。

Setting pluginはデフォルトではsettingsテーブルを利用して設定値を管理します。

ポイントは、$this->Setting->find() ではなくて、Configureクラスのように Setting::getSetting([key]) と、どこでも呼べるように作っている点です。

ただ、Configureと異なるのは、「あらかじめ設定できるkeyを限定する(やみくもに設定させない)」という点と「設定するkeyの値にバリデーションチェックを行える」という点です。

具体的には例えば、以下のように設定します。

Configure::write('Setting.settings', array(
    'password_min' => array('rule' => array('numeric'),
                            'default' => 6),
));

上記のように設定するとSetting pluginで設定管理できるのはpassword_minだけです。さらに値入力時(Setting::setSetting())には数値チェックがかかります。

さらに、defaultオプションを書いていれば、最初に自動でデータベースへ設定値を保存してくれます。

上記のように設定するだけで全ての設定が完了し、Setting::getSetting('password_min');と書いて設定値を取得することができます。

データベースの値を直接修正すれば、(キャッシュが消えたタイミングで)設定を永続的に変更できるので、ソースコード変更いらずです。

また、基本的にキャッシュを活用するので、常にデータベースにアクセスするわけではありません。

Setting::setSetting('password_min', $length);といった設定変更機能も実装できます。

Setting pluginで管理していると、いざ設定変更機能を作りやすい

そうなんです。

Setting::setSetting([key], [value]);もあるし、バリデーションも設定可能。」ということは、いざ「設定変更画面」を作るときに非常に楽なんです。

モデル部分は既に作っているようなものです。


まあ、


そこまでになることはなかなかないですかね。。。。

というわけで

「細かすぎて伝わらないCakePHP Pluginシリーズ」 Setting pluginの紹介でした。