CakePHP解析 Archive
basics.php – stripslashes_deep($value) (CakePHP解析 #10)
- 2008-08-21 (木)
- CakePHP解析
今回はdispatcher.phpで呼び出されているstripslashes_deep関数を解析します。
この関数はPHPのmagic_quotes_gpcがonの場合でも問題なく動作させるために使用されています。
if (ini_get('magic_quotes_gpc') == 1) {
if (!empty($_POST)) {
$params['form'] = stripslashes_deep($_POST);
}
} else {
$params['form'] = $_POST;
}
ここで、magic_quotes_gpcがonの場合に、裏でどんな処理が行われるのかをおさらいしておきます。
マニュアルによると
オンの場合、全ての’ (シングルクオート), ” (ダブルクオート), \ (バックスラッシュ)および
NULL 文字がバックスラッシュで自動的にエスケープされます。 これは、addslashes() の機能と同じです。
つまり、「Is your name O’reilly?」は、「Is your name O\’reilly?」に自動的に変換されるわけです。
この変換処理はHTTPリクエストデータ(GET, POST, そして COOKIE)に対して行われます。
そして、この変換されてしまったデータを元に戻すために使用されるのがstripslashes_deep()関数です。
この関数は「cake/basics.php」内に定義されています。
function stripslashes_deep($value) {
if (is_array($value)) {
$return = array_map('stripslashes_deep', $value);
return $return;
} else {
$return = stripslashes($value);
return $return ;
}
}
引数が配列で無い場合と、配列の場合で処理が分かれています。
まずは配列で無い場合ですが、stripslashes関数で変換した値を返して終了しています。
stripslashes関数はmagic_quotes_gpcが行う変換処理の反対の変換を、つまり
「Is your name O\’reilly?」であれば、「Is your name O’reilly?」に変換します。
次は配列の場合の処理を見てみます。
まずarray_mapですが、これは第一引数で指定されている関数を、第二引数の配列の各値を引数にして呼び出す関数です。
ここでポイントになるのはarray_map内でstripslashes_deep関数を、つまり自分自身を関数内で呼び出している点です。
これは再帰関数と呼ばれるものになりますが、初めはなぜ「stripslashes」でなく「stripslashes_deep」を呼び出す必要があるのか疑問でした。
ただし、よくよく考えてみると配列の中身も配列、更にその中身も配列の可能性が…と考えると「なるほど再帰関数ってこういう
使い方をするのか」と感心してしまいました。
この関数を作った人が関数名に「_deep」と付けたのもうなづけます。
再帰関数を理解するのにうってつけのお手本ではないでしょうか。
dispatcher.php – $this->parseParams($url) (CakePHP解析 #9)
- 2008-08-11 (月)
- CakePHP解析
今回は$Route->parseから戻ってparseParamsメソッドの解析をします。
以前解析したように$Route->parse(’users/login/aaaa/bbbb/cccc/dddd?a=A&b=B’)の戻り値は
下記のような配列になります。
Array ( [pass] => Array ( [0] => aaaa [1] => bbbb [2] => cccc [3] => dddd ) [controller] => users [action] => login )
この結果を$params変数が受け取っているわけですが、この$params変数は「$this->data」を保持する非常に重要な変数です。
下記のようにその後の処理でform値やurl値を取り込んでいます。
if (ini_get('magic_quotes_gpc') == 1) {
if (!empty($_POST)) {
$params['form'] = stripslashes_deep($_POST);
}
} else {
$params['form'] = $_POST;
}
次回はこの処理の中で使用されている「stripslashes_deep」関数を解析します。
dispatcher.php – $Route->parse【その弐】 (CakePHP解析 #8)
- 2008-07-15 (火)
- CakePHP解析
今回は $Route->parseを更に解析する予定でしたが、正直何をしたいのかがいまいち分からない。どうやら$Routeオブジェクトの$routes配列にいろいろ突っ込んでいるようです。
一体どんな値を入れているのかだけ、出力して終了(>_<)
CakePHPのよく理解している人なら見当がつくのかな。
Router Object
(
[routes] => Array
(
[0] => Array
(
[0] => /
[1] => /^[\/]*$/
[2] => Array
(
)
[3] => Array
(
[controller] => schedules
[action] => index
)
)
[1] => Array
(
[0] => /pages/*
[1] => #^/pages(?:\/(.*))?[\/]*$#
[2] => Array
(
)
[3] => Array
(
[controller] => pages
[action] => display
)
)
[2] => Array
(
[0] => /tests
[1] => #^/tests[\/]*$#
[2] => Array
(
)
[3] => Array
(
[controller] => tests
[action] => index
)
)
[3] => Array
(
[0] => /bare/:controller/:action/*
[1] => #^/bare(?:\/([^\/]+))?(?:\/([^\/]+))?(?:\/(.*))?[\/]*$#
[2] => Array
(
[0] => controller
[1] => action
)
[3] => Array
(
[bare] => 1
)
)
[4] => Array
(
[0] => /ajax/:controller/:action/*
[1] => #^/ajax(?:\/([^\/]+))?(?:\/([^\/]+))?(?:\/(.*))?[\/]*$#
[2] => Array
(
[0] => controller
[1] => action
)
[3] => Array
(
[bare] => 1
)
)
[5] => Array
(
[0] => /:controller/:action/* (default)
[1] => /^(?:\/(?:([a-zA-Z0-9_\-\.\;\:]+)(?:\/([a-zA-Z0-9_\-\.\;\:]+)(?:[\/\?](.*))?)?))[\/]*$/
[2] => Array
(
[0] => controller
[1] => action
)
[3] => Array
(
)
)
)
[__admin] =>
[_log] =>
)
追記
$route配列をよくよく観察してみると、CakePHPの遷移処理を管理しているように見えますね。
下記の例だと
[0] => /
[1] => /^[\/]*$/
[2] => Array
(
)
[3] => Array
(
[controller] => schedules
[action] => index
)
おそらく[0]がルートパスを表していて、[1]が遷移に関する正規表現?、[2]はひとまず置いといて
[3]は実行するコントローラーとアクション。
[1]の正規表現は何を意味しているんだろう?
「/^[\/]*$/」にマッチするのって「/」とか「///」みたいに、ひたすらスラッシュの文字列だけのように思うんだけど。
もう少しCakePHP理解しないと、分からないかな。
- 検索
- フィード
- メタ
- お城
-