LoginSignup
3
4

More than 5 years have passed since last update.

CakePHP(2.x)でコントローラのrequest値の変換を1箇所にまとめる

Posted at

概要

  • コントローラの $this->request->data の値の変換処理を1箇所にまとめたい。
  • コントローラでデータを受け取ったときにアクションでデータを修正したりするが、この変換を別の所でまとめたい。
app/Controller/xxxController.php
    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

app/Controller/Component/ConverterComponent.php
    protected function convert($request, $field = '')

変換の定義・種類はモデルまたはコントローラに定義しています。
コントローラに定義した場合のみ、そのコントローラだけの変換処理になります。

app/Model/It.php.php
    protected static $convertList = array(
        // モデルのカラム名 'name' => array(変換定義)
        'name' => array('trim', 'line', 'katakana'),
    );
app/Controller/ItController.php
    public $components = array(
        'Converter' => array(
            // モデル名 'It'
            'It' => array(
                // モデルのカラム名 'note' => array(変換定義)
                'note' => array('rtrim', 'line', 'hankaku'),
            ),
            // モデルに属さない変数名 'note2'
            'note2' => array('cutSpace', 'zenkaku'),
        ),
    );

配列内の 'trim', 'line', 'katakana' などの値に対応した変換処理はコンポーネントで行われます。

app/Controller/Component/ConverterComponent.php
    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() を再帰的に行います。
コントローラにコンポーネント名を記述しておくだけで適用されます。

app/Controller/ItController.php
    public $components = array(
        'StripScript',
    );
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4