Home > CakePHP | PHP > CakePHP $_GET/$_POSTの値はどこに?

CakePHP $_GET/$_POSTの値はどこに?

この記事の所要時間: 348

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&#91;'foo'&#93; = 'server';
    $_ENV&#91;'foo'&#93; = 'env';
    putenv('foo=getenv');
    // server を出力
    var_dump(env('foo'));

    unset($_SERVER&#91;'foo'&#93;); 
    // env を出力
    var_dump(env('foo'));

    unset($_ENV&#91;'foo'&#93;); 
    // foo を出力
    var_dump(env('foo'));
  }
}
?>

6. $_REQUEST/$_GLOBALS

$_REQUEST/$_REQUESTの値は特に参照する方法は用意されていません。フレームワークでも参照している箇所は見当たりませんでした。

Pocket

follow us in feedly

トラックバック: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

Home > CakePHP | PHP > CakePHP $_GET/$_POSTの値はどこに?

検索
フィード
メタ情報

Return to page top