概要
- コントローラの $this->request->data の値の変換処理を1箇所にまとめたい。
- コントローラでデータを受け取ったときにアクションでデータを修正したりするが、この変換を別の所でまとめたい。
public function form() {
if (isset($this->request->data['Book']['name'])) {
// 端の半角スペース削除
$this->request->data['Book']['name'] = trim($this->request->data['Book']['name']);
// 改行コード削除
$this->request->data['Book']['name'] = str_replace(array("\r", "\n"), "", $this->request->data['Book']['name']));
}
}
ソースコード
サンプルはこちらに置いてあります。
https://github.com/gold1/CakePHP-convert-sample
下にソースコードの説明を書きます。
ConverterComponent の関数 convert は $this->request->data の配列の値を再帰的に変換しています。
https://github.com/gold1/CakePHP-convert-sample/blob/master/app/Controller/Component/ConverterComponent.php
protected function convert($request, $field = '')
変換の定義・種類はモデルまたはコントローラに定義しています。
コントローラに定義した場合のみ、そのコントローラだけの変換処理になります。
protected static $convertList = array(
// モデルのカラム名 'name' => array(変換定義)
'name' => array('trim', 'line', 'katakana'),
);
public $components = array(
'Converter' => array(
// モデル名 'It'
'It' => array(
// モデルのカラム名 'note' => array(変換定義)
'note' => array('rtrim', 'line', 'hankaku'),
),
// モデルに属さない変数名 'note2'
'note2' => array('cutSpace', 'zenkaku'),
),
);
配列内の 'trim', 'line', 'katakana' などの値に対応した変換処理はコンポーネントで行われます。
protected function convertByType($str, $type, $model_name) {
switch ($type) {
case 'trim':
$str = trim($str);
break;
case 'rtrim':
$str = rtrim($str);
break;
case 'line':
$str = str_replace(array("\r", "\n"), "", $str);
break;
// ...
同じような方法でサニタイズ処理を再帰的に行うStripScriptコンポーネントもあります。
https://github.com/gold1/CakePHP-convert-sample/blob/master/app/Controller/Component/StripScriptComponent.php
これは $this->request->data にサニタイズ処理 Sanitize::stripScripts() を再帰的に行います。
コントローラにコンポーネント名を記述しておくだけで適用されます。
public $components = array(
'StripScript',
);