9 月
[symfony]ログイン認証バリデータ(データベース接続)のサンプル
symfony1.1で、メールアドレスとパスワードによるログインフォームを作りたい。
メンバー情報などが記録されたMemberテーブルは以下の仕様
TEXT:
-
propel:
-
member:
-
_attributes: { idMethod: native }
-
id: { type: INTEGER, required: true, autoIncrement: true, primaryKey: true }
-
name: { type: VARCHAR, size: '255', required: true, default: '' }
-
mail_pc: { type: VARCHAR, size: '255', required: true, default: '' }
-
password: { type: VARCHAR, size: '255', required: true, default: '' }
-
created_at: { type: TIMESTAMP }
-
updated_at: { type: TIMESTAMP }
-
last_logined_at: { type: TIMESTAMP }
-
is_admin: { type: TINYINT, default: '0' }
-
enabled: { type: TINYINT, required: true, default: '1' }
ログインフォームに必要なバリデータは、個々の項目(mail_pc、password)のバリデートと、データベースへの問い合わせの2つ。個々の項目のバリデートはバリデータを使えばすぐにできそう。以下のような感じ。
php:
-
class LoginForm extends sfForm
-
{
-
public function configure()
-
{
-
));
-
-
'mail_pc' => 'PCメールアドレス',
-
'password' => 'パスワード',
-
));
-
-
$this->widgetSchema->setNameFormat('login[%s]');
-
-
'mail_pc' => new sfValidatorEmail(
-
'required' => 'メールアドレスを入力してください。',
-
'invalid' => 'メールアドレスが正しくありません。'
-
)
-
),
-
'password' => new sfValidatorString(
-
'required' => 'パスワードを入力してください。',
-
'min_length' => 'パスワードは%min_length%文字以上です。',
-
'max_length' => 'パスワードは%max_length%文字以下です。',
-
)
-
)
-
));
-
}
-
-
}
エラー処理とかもバリデータが一括で請け負ってくれるので、データベースへの問い合わせもバリデータにすればすっきりすると思って、作ろうと思ったけど、ネット上に資料が少ない。どうやっていいかよくわからない。
とりあえず、複数項目のバリデートだから、validatorSchemaのsetPostValidator()に登録するんじゃないかと気づく。こんな感じでsfValidatorSchemaLoginクラスを作ってみた。
php:
-
/**
-
* sfValidatorSchemaLogin
-
*
-
* @package Travi
-
* @subpackage validator
-
*/
-
class sfValidatorSchemaLogin extends sfValidatorBase
-
{
-
/**
-
* @see sfValidatorBase
-
*/
-
protected function doClean($values)
-
{
-
if ($values['mail_pc'] != '' && $values['password'] != '') {
-
// 両パラメータが与えられたときだけ実行
-
$encrypted_password = myUtil::encrypt($values['password']);
-
if (MemberPeer::isValidUser($values['mail_pc'], $encrypted_password)) {
-
return $values;
-
} else {
-
}
-
}
-
return $values;
-
}
-
}
このクラスのミソは、必要なパラメータ(メールアドレスとパスワード)がそろったときだけ、データベースに問い合わせること。なぜかというと、メールアドレスかパスワードのバリデータが成功した時点でデータベースの問い合わせをした方が効率がいいので。
最後に、LoginFormのPostValidatorを登録
php:
意外と簡単にいけたけど、もっとスマートな方法ないかなぁ。。。Propel系の標準Validatorがいまいちよくわからないんだな。

