PHPのスーパーグローバルの値をどのように参照すれば良いかまとめてみました。
Controller#dataやアクションメソッド引数のようにフレームワークで想定された使い方をしている分には特に問題無いのですが、ちょっと他のことをやろうとすると、どこに値が格納されているか分からず困った事がありました。
# もちろん$_GET/$_POSTを使えば値は取れますが、せっかくのフレームワークなのでなるべくその中で値を使いたいものです。
1. $_GET
$_GETの値はController#params[‘url’]に格納されます。
ちなみに$_GET[‘url’]はURLルーティング(リクエストURIからコントローラ・モデル等を決定)で、$_GET[‘file’]は[app/webroot/js/vendors.php]で参照されています。
[http://example.com/foo/index/?id=1&code=abcd&offset=10]でアクセス
<?php class FooController extends AppController { function index() { // $this->params['url']['id'] => 1 // $this->params['url']['code'] => 'abcd' // $this->params['url']['offet'] => 10 } } ?>
2. $_POST
$_POSTの値はController#params[‘form’]に格納されます。
なお中でも$_POST[‘data’]は特別で、Controller#data/Controller#params[‘data’]にも格納されます。
[id=1&name=abcd&comment=Hello!!&data[Foo][name]=Bar]をPOST
<?php class FooController extends AppController { function index() { // $this->params['form']['id'] => 1 // $this->params['form']['name'] => 'abcd' // $this->params['form']['comment'] => 'Hello!!' // 以下3つは同じ // $this->params['form']['data']['Foo']['name'] => 'Bar' // $this->params['data']['Foo']['name'] => 'Bar' // $this->data['Foo']['name'] => 'Bar' } } ?>
3. $_COOKIE
$_COOKIEの値を参照する方法は用意されていません。もし$_COOKIEの値を使用する場合は直接参照するしかないようです。
ちなみにフレームワーク側はCakeSessionクラスがこの値を参照しています。
4. $_FILES
$_FILESはおおよそ$_POSTと同様にキーによって格納される場所が異なります。
まず$_FILES[‘data’]以外の箇所についてですが、これは$_POSTと同じようにController#params[‘form’]に格納されます。
つぎに$_FILES[‘data’]ですが、こちらは$_POST[‘data’]と同じようにController#data/Controller#params[‘data’]に格納されます。ここでは$_FILES[‘data’]がそのまま格納されるわけではなく、下のソースのように[$model][$field][$key]の連想配列に値を格納されます。
[cake/dispatcher.php:340]
if (isset($_FILES['data'])) { foreach ($_FILES['data'] as $key => $data) { foreach ($data as $model => $fields) { foreach ($fields as $field => $value) { $params['data'][$model][$field][$key] = $value; } } } }
$_POST[‘data’]の場合と異なり、$_FILES[‘data’]の値はController#params[‘form’]には格納されません。
なお、$_FILESの格納処理は$_POSTの値が格納された後に行われます。つまり$_POSTと$_FILESが同じキーを持つ値は$_FILESの値で上書きされてしまいますのでご注意を。
5. $_ENV/$_SERVER
$_ENV/$_SERVERの値は[cake/basics.php]にあるenv()関数で参照できます。
どちらの変数にも同じキーで値がある場合は、$_SERVERの値が優先され、次に$_ENVの値になります。双方に該当するキーが無い場合はgetenv()の値が返ります。(全てのキーが無ければnullが返ります。)
<?php class FooController extends AppController { function index() { $_SERVER['foo'] = 'server'; $_ENV['foo'] = 'env'; putenv('foo=getenv'); // server を出力 var_dump(env('foo')); unset($_SERVER['foo']); // env を出力 var_dump(env('foo')); unset($_ENV['foo']); // foo を出力 var_dump(env('foo')); } } ?>
6. $_REQUEST/$_GLOBALS
$_REQUEST/$_REQUESTの値は特に参照する方法は用意されていません。フレームワークでも参照している箇所は見当たりませんでした。
- Newer: CakePHP モデルのvalidates()に注意
- Older: Twitterで暇つぶし
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2007/04/cakephp_php_superglobals.html/trackback
- Listed below are links to weblogs that reference
- CakePHP $_GET/$_POSTの値はどこに? from Shin x blog