Всем привет. Находясь в процессе изучения фреймворка вздумалось мне переделать регистрацию с ActiveRecord на Database Access Objects. В принципе сделал и все работает, но вот вопрос правильно ли я делаю вообще?? Так как похожих пример в сети не так уж и много, понятное дело что делать регистрацию/авторизацию на DAO не кому и в голову не придет, но все же...
В контроллере описываю стандартный метод:
public function actionRegister() {
$model = new RegForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if ($user = $model->reg()) {
echo '<pre>'; print_r($user); echo '</pre>';
} else {
echo 'Register Error';
}
}
return $this->render('reg', ['model' => $model]);
}
Который проводит валидацию и т.д., в RegForm меня смущает что не получается проверить email на уникальность кроме как:
public function rules() {
return [
// ...
['email', 'checkEmail'],
// ...
];
}
public function checkEmail($attribute) {
if (User::checkEmail($this->email))
$this->addError($attribute, 'Эта почта уже занята!!!');
}
В модели
User extends Modelpublic function checkEmail($email) {
$db = Yii::$app->db;
$check = $db->createCommand('SELECT COUNT(*) FROM {{%user}} WHERE email=:email')
->bindValue(':email', $email)
->queryOne();
return $check['COUNT(*)'];
}
Может как то можно это более сократить??
Далее идет сохранение:
public function reg() {
return User::add($this->email, $this->password, $this->action);
}
И в User:
public function add($email, $password, $action = 'Y') {
$db = Yii::$app->db;
$db->createCommand()->insert('{{%user}}', [
'action' => $action,
'email' => $email,
'password_hash' => Yii::$app->security->generatePasswordHash($password),
'auth_key' => Yii::$app->security->generateRandomString(),
'create_at' => date('Y-m-d H:i:s')
])->execute();
$ress = $db->createCommand('SELECT * FROM {{%user}} WHERE email=:email')
->bindValue(':email', $email)
->queryOne();
return $ress;
}
И все... Работает все замечательно, но смущает тот факт что при выполнение всего этого выполняется аш целых 5 запросов:
SELECT COUNT(*) FROM `bav_user` WHERE email='em3ail@mails.com'
SHOW FULL COLUMNS FROM `bav_user`
SHOW CREATE TABLE `bav_user`
INSERT INTO `bav_user` (`action`, `email`, `password_hash`, `auth_key`, `create_at`) VALUES ('Y', 'em3ail@mails.com', '$2y$13$qZC4jOM0gLG7vgvWU8t0keENXlnYFzoetrsFzQpkavwktootfD.Rq', 'RuHh8UQK5V16FsEKSxZPLvSLQNhw-xCU', '2015-07-19 00:10:08')
SELECT * FROM `bav_user` WHERE email='em3ail@mails.com'
При чем второй самый тяжелый.
Правильно ли я вообще движусь или что то упустил??