CakePHPの環境を判定するTips (CakePHP Advent Calendar 10日目)
@mon_sat です。
というわけで、CakePHP Advent Calendar に参加してみました。
本日12月10日で起業して4年目を迎えました。
今後ともどうぞよろしくお願いします。
CakePHP Advent Calendar については、下記のリンクを参照のこと。
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=2510&forum=16&post_id=6333
「そんな軽いネタで大丈夫か?」
「大丈夫だ。問題ない」
ということで、さくっとしたネタでいきます。
CakePHPの環境を判定するTipsです。
本番環境/テスト環境/開発環境という3つの環境で同じコードを使っているとき、コード内で環境を判定したいときがあります。
有名なのは @cakephper さんのこの記事。
http://d.hatena.ne.jp/cakephper/20081222/1229915518
私もずいぶんお世話になったものです。
ですが、いくつか問題があります。
- httpd.confの編集が必要になるため環境によっては使えないこともある
-
cronやcakeのshell等、webサーバーを通さずに実行すると環境変数がとれない
元記事が追記されました。CakePHPの env() を使うと、shellでも使えて便利と。なるほどですねー
というわけで私のやり方を。(解説等は後回しで)
<?php
# app/libs/environment.php
class Environment {
static $production = "prod";
static $test = "test";
function getEnv() {
return basename(ROOT);
}
function isProduction() {
return self::getEnv() === self::$production;
}
function isTest() {
return self::getEnv() === self::$test;
}
function isDevelop() {
return !self::isProduction() && !self::isTest();
}
}
<?php
# app/config/bootstrap.php
# Import & Example
App::import('Lib', "Environment");
if (!Environment::isProduction()) {
Configure::write('debug', 2);
}
(上記のEnvironmentクラスはPHP5の書き方をしています。PHP4の方は適宜修正が必要です)
使い方は、CakePHPの各ディレクトリを以下のように配置します。
/var/www/sample.com/prod/
cake
app
vendors
CakePHPのappを入れるディレクトリ名で判定するのです。
(上記の例ではprodのところ)
※本番環境の例
※テスト環境では prod の代わりに test とします。
※開発環境では prod,test 以外にします。
このやり方の利点
- 判定ロジックが簡便なため、Environmentクラス無しでも利用できる ex if (basename(ROOT) == "dev") debug("Develop"); せっかくROOTなんていう定数あるのですから。
- CakePHPのアプリケーションの中であれば、テストでもシェルでもどこでも判定できる
- 開発と本番で同一のコードで記述できる
- ロジックを拡張することで、複数人で開発するときに自分の環境だけで実行するようなチェック用コードを簡単に書ける
というわけでCakePHPを始めて間もない方、ご参考あれ。
もっと良いやり方があるよ!という方はぜひ @mon_sat へ。(このブログに追記したいと思います)
そして明日は http://www.msng.info/ でお馴染みの @msng さんです!楽しみですねー。
追記
- 140文字の要約リンクを追加しました
- 元記事修正に伴い、一部改訂しました