@esKei
Frontend разработчик

Yii2 и DAO. Правильно ли иду?

Всем привет. Находясь в процессе изучения фреймворка вздумалось мне переделать регистрацию с 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 Model
public 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'


При чем второй самый тяжелый.
Правильно ли я вообще движусь или что то упустил??
  • Вопрос задан
  • 982 просмотра
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
на DAO не кому и в голову не придет,

Ну вам же пришло. DAO норм, если у вас оно все закрыто в репозитории каком. Или CQRS балуетесь. В целом вам решать тогда как реализовать persistance layer

правильно ли я делаю вообще??

Правильно весьма субъективная штука. В основном правильно это то, что не мешает дальше расширять систему. В частности для меня правильно это соответствие persistence ignorance. Из php-шных ORM-ок это дело позволяет реализовывать только доктрина (вроде как еще пропел скоро будет в списке), так что лучше уж DAO чем active record-ы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы