CakePHPで現在のパスやURLを取得する

CakePHPを使っているときに現在のURLを得る方法が分からなかったのでメモ。
第二引数をtrueにするとURLが、falseにするとスラッシュから始まる絶対パスが返されます。
こんな便利なメソッドがあったとは・・・危うくURL定数を作るところでした。
第一引数をnullにすると現在のパスがそのまま返ってくるのも便利!

$html->url('/controller/action/', true); // ビューのみ
Router::url('/controller/action/', true); // コントローラやモデルなどどこでも可

HTMLヘルパーはViewでしか使えないのに対して、
Routerクラスは静的クラスなのでどこからでもアクセスできます。

2011年12月05日追記:
CakePHP2.2ではHTMLヘルパーの参照方法が変わっていたので追記しておきます。
引数の仕様は同じで第二引数をtrueにするとURLになり、
false(デフォルト値)にすると絶対パスです。

$this->Html->url('/controller/action/', true);
Router::url('/controller/action/', true);

2015年4月2日追記:
CakePHP3でまた使用方法が若干変わっていたので別記事(CakePHP3で現在のパスやURLを取得する)に書きました。

PHP5で定数の定義はどうするべきか

今まではPHPで定数といえば普通に大文字の変数名で定義しておくか、define関数を使って定義するかだったと思います。

変数の定義はのメリットとにかく手軽ということが挙げられます。制約などを考えずにいつもの変数通りに使えます。
逆にデメリットは変数であるということ。簡単に上書きできてしまいますし、グローバルな名前空間も汚してしまいます。「変」数なんです。「定」数ではありません。

//定数絡みの命名はよく大文字アンダーバー区切りが用いられる
$APPLE = 'リンゴ';
$ORANGE = 'オレンジ';

//もちろん配列や関数などによる定義も自由に可能
$FROUIT_LIST = array($APPLE, $ORANGE);

//上書きされる可能性もつきまとう
$ORANGE = 'グリーン';

もう一つのdefine関数の定義はしっかり定数です。define関数で定義する時、通常通り式による定義も出来ます。
デメリットとしては名前空間がグローバルなこと。変数とは名前は別扱いですがいろんなファイルやライブラリでどんどん定数を定義していくと重複の可能性も出てきますし、近年の名前空間を取り入れる流れからするとあんまりよくないです。PHPであらかじめ定義されている定数も結構な数あるためちょっと使いにくい。

define('ECODE_NOT_FOUND', 100);
define('ECODE_BAD_REQUEST', 200);
//式や関数による定義も可能
define('NEXT_MONTH', date('n', mktime(0, 0, 0, date('n')+1, date('j'), date('Y'))));

if( !file_exists('C:\define.txt') ) {
    //通常の変数と同じように値の参照が可能
    echo 'エラーコード:' . ECODE_NOT_FOUND
    die();
}

PHP5ではオブジェクト指向の機能が本格的に強化されJavaのような要素もじゃんじゃん取り入れられています。
この記事を書いている現在はPHP5.3が主流かと思います。オブジェクト指向化の中でクラス定数というものも出てきました。位置付けとしてはクラスに属する定数です。クラス定数はクラスの中でconstキーワードを用いて定義します。こんな感じで使えます。

//クラス定数を定義する専用のクラスを作るのもあり
class CONFIG {
    const TOPPAGE_URL = 'http://https://sousaku-memo.net/';
    const DEBUG_MODE = true;
    //以下の定義はエラーが発生するので注意
    //配列や式(Expression)による柔軟な定義が出来ないのが痛い…
    //const FAILD_ARRAY_DEFINE = array(10,20,4);
}

//参照するときは::(ダブルコロン)演算子を用いる。
//クラス名の接頭辞が付くことにより名前空間を汚さないのはGood
echo sprintf('<a href="%s" target="_blank">創作メモ帳トップページ</a>', CONFIG::TOPPAGE_URL);

んー、どれもメリットデメリットがあります…
PHP6にはクラス定数の強化を望みます。

自分はどうしているかというと、クラス定数はやっぱり式による定義が出来ないのがつらいのでdefine関数で定義をしています。また、あちこちで定義すると分からなくなるのでまとめてコメント付きで定義しています。

PHPのdate関数でよく使うフォーマット

まずは一般的によく使われているかと思う「2010-09-13」の形式。
第二引数が無いため現在の日付が表示されます。

date('Y-m-d')

次に時分秒を追加した「2010-09-13 11:50:05」の形式。
仮にひと桁の場合でも先頭に0を付与した二桁で表現される。

date('Y-m-d H:i:s')

月日をひと桁にする場合は以下の通り。

date('Y-n-j');