メモ:CakePHP -バリデーション後にパスワードをハッシュ化する

CakePHPで、パスワードのバリデーション後にハッシュ化してデータベースに保存したい場合のメモです。

初歩的な事かもしれませんが、CakePHPはデータベースに保存するsave()にバリデーション機能が組み込まれています。save()前にハッシュ化すると、ハッシュされたパスワードに対してバリデーションが実行されるため、パスワードの平文に対して文字数チェックができません。

ハッシュ化のタイミングはバリデーション後のデータベース保存前に実行したいのですが、その方法について初心者は迷うんじゃないかと思ってメモしときます。

 

beforeSave()を使う

モデルで、データベース書き込み前に処理されるコールバックbeforeSave()を使います。

やり方は、ただモデルにbeforeSave()を追記するだけです。
引数の$optionsにnullを入れとかないとエラーになるので注意。

 App::uses('AuthComponent', 'Controller/Component');
//バリデーション
 public $validate = array(
  'password' => array(
   array(
    'rule' => array('between', 4, 20),
    'message' => 'パスワードは4文字以上20文字以内なのじゃ!'
   )
  )
 );

 //パスワードのハッシュ化
 public function beforeSave($options = null){
  $this->data[$this->name]['password'] = AuthComponent::password($this->data[$this->name]['password']);
  return true;
 }