Задать вопрос
@phpForeve

Почему не работает $model->save()?

Есть Форма
<?php

namespace app\models\forms;

use Yii;
use yii\base\Model;

use app\models\User;

class SignupForm extends Model
{
    public $username;
    public $email;
    public $password;
    public $password_confirm;
    public $role;
    public $status;

    public function rules()
    {
        return [
            [['username', 'email', 'password'], 'required', 'message' => 'Поля обязательны для заполнения'],
            [['password'], 'string', 'min' => 6, 'message' => 'Длина пароля не может быть меньше 6-ти символов'],
            [['password_confirm'], 'compare', 'compareAttribute' => 'password', 'message' => 'Пароли должны совпадать'],
            [['email'], 'email', 'message' => 'Недопустимый вид почты(<b>Пример: mail@example.com</b>)'],
            [['role'], 'in', 'range' => [User::ROLE_ADMIN, User::ROLE_MANAGER, User::ROLE_ROOT, User::ROLE_USER]],
            [['status'], 'in', 'range' => [User::STATUS_NEW, User::STATUS_ACTIVE, User::STATUS_BANNED, User::STATUS_DETETED]],
        ];
    }
}


Есть Модель
<?php
namespace app\models;

//YII components
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
use yii\db\Exception;

/**
 * This is the model class for table "users"
 *
 * @property integer $id
 * @property string $username
 * @property string $email
 * @property string $password
 * @property string $role
 * @property string $status
 * @property string $access_token
 * @property string $recovery_token
 * @property string login_at
 * @property string created_at
 * @property string updated_at
 * @property string deleted_at
 */

class User extends ActiveRecord implements IdentityInterface {

    //STATUSES
    const STATUS_ACTIVE = 'active';
    const STATUS_NEW = 'new';
    const STATUS_BANNED = 'banned';
    const STATUS_DETETED = 'deleted';

    //ROLES
    const ROLE_USER = 'user';
    const ROLE_MANAGER = 'manager';
    const ROLE_ADMIN = 'admin';
    const ROLE_ROOT = 'root';

    public static function tableName()
    {
        return 'users';
    }

    public function rules()
    {
        return [
          [['username', 'email', 'password', 'role', 'status',
              'access_token', 'recovery_token', 'login_at', 'created_at',
              'updated_at', 'deleted_at'], 'safe'],
        ];
    }

    public function behaviors() {
        return [
            'DefaultTimestampBehaviour' => [
                'class' => TimestampBehavior::className(),
                'value' => (new \DateTime())->format('Y-m-d H:i:s')
            ]
        ];
    }

    public function getTokens() {
        return floatval($this->access_token);
    }

    public function setPassword($password) {
        return password_hash($password,PASSWORD_BCRYPT);
    }

    public function validatePassword($password) {
        return password_verify($password, $this->password);
    }

    public static function findIdentity($id)
    {
        return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
    }

    public static function findIdentityByAccessToken($token, $type = null) {
        return static::findOne(['access_token' => $token, 'status' => self::STATUS_ACTIVE]);
    }

    public function getId()
    {
        return $this->getPrimaryKey();
    }

    public function validateAuthKey($access_token)
    {
        return $this->getAuthKey() === $access_token;
    }

    public function getAuthKey()
    {
        return $this->access_token;
    }

    public function signup($attributes = []) {
        $user = new User();

        $user->username = $attributes['username'];
        $user->email = $attributes['email'];
        $user->password = User::setPassword($attributes['password']);
        $user->role = self::ROLE_USER;
        $user->status = self::STATUS_NEW;

        if (!$user->save(false)) {
            throw new Exception('Ошибка при записи модели в базу ' . $user->getErrors(), 500);
        }

        return $user;
    }

}


Есть Экшон
public function actionSignup() {
        $transaction = Yii::$app->db->beginTransaction();
        try {
            $data = [];

            $form = new SignupForm();
            $form->attributes = Yii::$app->request->getBodyParams();
            if (!$form->validate()) {
                throw new Exception('Невалидная форма регистрации', $form->getErrors(), 500);
            } else {
               $user =  User::signup($form->attributes);
            }

        } catch (Exception $ex) {
            $transaction->rollBack();
            throw $ex;
        }

        var_dump($user);
    }


Форма валидируеться отлично, передаю данные в модель, пытаюсь сделать save - он срабатывает, но в базе ничего не появляется, причем автоинкремент у таблицы увеличивается.

Вот что лежит в $user в самом конце (т.е. все данные у нас есть)

"data": {
        "username": "Тест",
        "email": "test@example.com",
        "password": "$2y$10$t5OZ5okdCwnInz/RWag6LOnN7ySYrUeKaKkbbgylgJcEAQlfelVE2",
        "role": "user",
        "status": "new",
        "created_at": "2017-06-25 01:00:46",
        "updated_at": "2017-06-25 01:00:46",
        "id": "20"
    }
  • Вопрос задан
  • 232 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@BorisKorobkov
Web developer
Перед catch надо добавить $transaction->commit();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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