アップロードメソッド

汎用的に使えるようにしたい

現状
  • 容量オーバーなら-2を返す
  • 成功したらファイル名を返す
    • 戻り値の役割が混乱してる
    • $width, $height, $sizeも返したい
配列で返す
  • return array($errorcode, $filename, $width, $height, $size)
  • 呼ぶときは、list(.....)=upload($this->data)
    • 独立性は高い(コピペで使える)
  • エラー処理はコントローラーで書かなきゃならん
  • $filename, $width, $height, $sizeをコントローラーで書き換える必要がある
  • そもそも戻り値が複数の関数は好きじゃない
オブジェクトで返す
リファレンス(引数定義に&)で与えてメソッド内で書き換えちゃう
  • 複数の戻り値で悩まない
  • コードの可読性が落ちる場合もある
  • 戻り値はエラーコード数値にしよう
	function upload(&$data, $field) {
        if (!is_array($data)) return false;
        if (!isset($data['Estate'][$field])) return false;
        // 画像ファイルのみ保存
        if (!preg_match("/^image\/(p?jpeg|gif|(x-)?png)$/", $data['Estate'][$field]['type'])) return false;
        // 拡張子の取得
        $ext = preg_replace("/.*\./", null, $data['Estate'][$field]['name']);
        //ファイル名は'物件ID_写真番号.拡張子'
        $filename = $data['Estate']['id'] . '_' . str_replace('photo', '' ,$field) . '.' . $ext;
		//ファイルサイズ制限
		if($data['Estate'][$field]['size']>350*1024) return -2;
        // 移動できれば上書き
        if(move_uploaded_file($data['Estate'][$field]['tmp_name'], WWW_ROOT  . 'img' . DS . $filename)){
			$data['Estate'][$field . 'b'] = $data['Estate'][$field]['size'];
			$data['Estate'][$field] = $filename;
			list($width, $height) = GetImageSize(WWW_ROOT  . 'img' . DS . $filename);
			$data['Estate'][$field . 'w'] = $width;
			$data['Estate'][$field . 'h'] = $height;
		}
		return 1;
    }

これからcakePHPでメソッドを書くときは

  • 戻り値はエラーコード
    • エラー処理を一点集中できる
  • リファレンス渡しでメソッド内で書き換え

エラーコード(仮)

一つの処理につき
  • 0-9コード
  • 10と100の位で処理を示す
  • 1000の位はエラー後の処理を示す?
    • 処理中止、ログ出力、管理者メール
    • エラー詳細を画面に出力
    • デバッグ用の画面を出力
エラー処理はコントローラーの役目
  • 戻り値のエラーコードにより処理の振り分けするので、モデルメソッドにはエラー処理は書かない
  • 単純なエラーチェックなら、checkError($errorCode=upload($this->data))
  • if(upload($this->data) % 10 == 0){...}else{...}