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

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

  • 2007-04-18 (水) 23:37
  • CakePHP | PHP
  • このエントリーをはてなブックマークに追加
この記事の所要時間: 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:
  1. <?php
  2. class FooController extends AppController {
  3.   function index() {
  4.     // $this->params['url']['id'] => 1
  5.     // $this->params['url']['code'] => 'abcd'
  6.     // $this->params['url']['offet'] => 10
  7.   }
  8. }
  9. ?>

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:
  1. <?php
  2. class FooController extends AppController {
  3.   function index() {
  4.     // $this->params['form']['id'] => 1
  5.     // $this->params['form']['name'] => 'abcd'
  6.     // $this->params['form']['comment'] => 'Hello!!'
  7.  
  8.     // 以下3つは同じ
  9.     // $this->params['form']['data']['Foo']['name'] => 'Bar'
  10.     // $this->params['data']['Foo']['name'] => 'Bar'
  11.     // $this->data['Foo']['name'] => 'Bar'
  12.   }
  13. }
  14. ?>

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]

PHP:
  1. if (isset($_FILES['data'])) {
  2.             foreach ($_FILES['data'] as $key => $data) {
  3.  
  4.                 foreach ($data as $model => $fields) {
  5.  
  6.                     foreach ($fields as $field => $value) {
  7.                         $params['data'][$model][$field][$key] = $value;
  8.                     }
  9.                 }
  10.             }
  11.         }

$_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:
  1. <?php
  2. class FooController extends AppController {
  3.   function index() {
  4.     $_SERVER['foo'] = 'server';
  5.     $_ENV['foo'] = 'env';
  6.     putenv('foo=getenv');
  7.     // server を出力
  8.     var_dump(env('foo'));
  9.  
  10.     unset($_SERVER['foo']);
  11.     // env を出力
  12.     var_dump(env('foo'));
  13.  
  14.     unset($_ENV['foo']);
  15.     // foo を出力
  16.     var_dump(env('foo'));
  17.   }
  18. }
  19. ?>

6. $_REQUEST/$_GLOBALS

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

トラックバック:0

このエントリーのトラックバックURL
http://www.1x1.jp/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