CakePHP

個人的によく使いまわすAppModelにおける5つのメソッド

俺がCakePHPの開発では最近は必ずというほど実装しているAppModelの機能をなんとなく紹介してみる。
だいたいはどこかのサイトに載っていたものを使っていますが、出所は覚えてなかったり。。。
CakePHP 1.2.7対応(おそらく1.2共通)

スポンサーリンク

開発環境と本番環境でDB切り替え

開発環境では開発用のDB、本番では本番用DBを自動で切り替える機能。
これやっとけば設定の書き換えなしで、本番アップ可能。

// app_model.php
function __construct($id = false, $table = null, $ds = null) {
    $this->useDbConfig = !IS_DEVELOP ? 'default' : $_SERVER['CAKE_DB_CONFIG'];
    parent::__construct($id, $table, $ds);
}

まぁこんな感じだけども、これは単体では働きません。IS_DEVELOP定数を定義せなあかんです。
それはbootstrap.phpに任せます。

// bootstrap.php
define('IS_DEVELOP', !empty($_SERVER['CAKE_DB_CONFIG']));

見て分かるとおり、上記2つともサーバー変数を読み取ってます。これは自身で定義しなければなりません。
開発環境の.htaccessに次のような記述をします。

SetEnv CAKE_DB_CONFIG develop

変数の中身であるdevelopの部分はdatabase.phpに定義している開発用DB設定名としてください。

バリデーション時のパスワードの暗号化回避

Authコンポーネントを使用していると、フォームから送信されたユーザパスワードが勝手に暗号化されてしまうので、バリデーションチェックに引っかかって、同じフォームに戻ってきたとしても既に暗号化されてる値がパスワード欄にセットされてしまいます。
そして、そのまま送信すると2重に暗号化されるというのを回避します。

// app_model.php
function beforeSave() {
    if (!empty($this->data[$this->alias]['_password'])) {
        App::import('Component', 'Auth');
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['_password']);
    }
    return true;
}

「password」をAuthコンポーネントのパスワード用フィールドとした場合、ダミーのフィールドである「_password」を用意する手法です。
保存直前に自前で暗号化を掛けることで、その前までは暗号化されていない状態を保てます。

入力確認フィールド用バリデーション

パスワードやメールアドレスなどの重要な情報を確認のために2回入力させた場合のバリデーションルールです。
バリデーション設定で引数に指定したフィールドと入力値が一致するかチェックします。

// app_model.php
function verify($data, $target) {
    if (empty($this->data[$this->alias][$target])) {
        return true;
    }

    $check = is_array($data) ? array_shift($data) : $data;
    return $check === $this->data[$this->alias][$target];
}

<8/13修正>
$targetで指定されたフィールドが空の場合はtrueを返してスルーするように変更しました。
そっちの方が使い勝手がいいので。

URL検証のルールに「~」を追加

共有レンタルサーバなんかで見かける「~」はデフォルトのURLルールでは弾かれてしまうので、それを追加しただけです。

// app_model.php
function url($data, $strict = false) {
    $check = is_array($data) ? array_shift($data) : $data;

    $_this =& Validation::getInstance();
    $_this->check = $check;
    $validChars = '([' . preg_quote('~!"$&\'()*+,-.@_:;=') . '\/0-9a-z]|(%[0-9a-f]{2}))';         // 「~」を追加
    $_this->regex = '/^(?:(?:https?|ftps?|file|news|gopher):\/\/)' . ife($strict, '', '?') .
        '(?:' . $_this->__pattern['ip'] . '|' . $_this->__pattern['hostname'] . ')(?::[1-9][0-9]{0,3})?' .
        '(?:\/?|\/' . $validChars . '*)?' .
        '(?:\?' . $validChars . '*)?' .
        '(?:#' . $validChars . '*)?$/i';
    return $_this->_check();
}

まともに働かないalphaNumericルールを正す

なんだかよくわからんのですが、もともとあるalphaNumericのバリデーションルールは環境によってはマルチバイト文字をスルーしてしまうようです。
それで全然まともに機能してくれなかったり…
シンプルにpreg_matchで書き直します。

// app_model.php
function alphaNumeric($data) {
    $check = is_array($data) ? array_shift($data) : $data;
    if (preg_match('/[^\\dA-Z]/i',$check)) {
        return false;
    } else {
        return true;
    }
}

以上、こんなところですが、もっとおすすめなのあったら是非教えてくださいな。

スポンサーリンク
管理人

システムえんじにゃー🐈
趣味はエレキギターなど。作曲したい。
WoWs/プリコネ
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする
surface0 (さーふぇす)をフォローする
Rain or Shine

コメント

タイトルとURLをコピーしました