Доброго времени суток. Решил переписать свой новый проект с Yii 1.1 на Yii 2. Возникла проблема, не знаю что делаю не так.
Допустим я получаю модель из БД и хочу получить её аттрибут, пусть это будет поле "name".
В Yii 1.1 это было бы примерно вот так:
$user = User::model()->findByPk(1);
echo $user->name;
В Yii 2.2 я пытаюсь это сделать вот так:
$user = User::findOne(1);
echo $user->name;
Получаю в ответ NULL. Что характерно, если у аттрибута name выставить private вместо public, то всё работает. Хотя ведь наоборот должно быть.
Вариант $user->getAttribute('name') также работает, но нет желания каждый раз писать такую конструкцию.
На stackoverflow прочитал, что нужно определить rules для аттрибутов модели.
Заранее спасибо за помощь :)
Код класса:<?php
namespace app\models;
class User extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface
{
public $id;
public $service;
public $service_id;
public $name;
public $avatar_url;
public $auth_key;
public $add_time;
public $update_time;
public $setting_safe_search = 1;
public $setting_only_good_video_quality = 1;
public $service_friends;
public static function tableName()
{
return '{{%users}}';
}
public function rules() {
$result = array(
// Обязательные поля
['auth_key', 'required'],
[['id', 'service_id', 'add_time', 'update_time'], 'integer'],
['name', 'string', 'max' => 80],
[['setting_safe_search', 'setting_only_good_video_quality'], 'boolean']
);
return $result;
}
public function getId()
{
return $this->id;
}
public function getAuthKey()
{
return $this->auth_key;
}
public function validateAuthKey($authKey)
{
return $this->auth_key === $authKey;
}
public static function findIdentity($id)
{
return self::findOne($id);
}
public static function findIdentityByAuthKey($auth_key)
{
return self::find()->where(['auth_key' => $auth_key])->one();
}
public static function findIdentityByAccessToken($token, $type = null)
{
foreach (self::$users as $user) {
if ($user['accessToken'] === $token) {
return new static($user);
}
}
return null;
}
public function getServiceNameById($id)
{
switch($id)
{
case 1:
return 'vkontakte';
break;
default:
return NULL;
break;
}
}
public function beforeValidate()
{
if($this->isNewRecord)
{
$this->auth_key = rand_string(30);
}
return parent::beforeValidate();
}
public function updateSocialInfo()
{
$info = VK::instance()->getInfo($this->service_id);
$this->name = $info->first_name . ' ' . $info->last_name;
$this->avatar_url = $info->photo_medium;
$this->service_friends = VK::instance()->getFriends($this->service_id);
$this->save();
}
public function beforeSave($insert) {
$time = time();
$this->service_friends = serialize($this->service_friends);
if($this->isNewRecord) {
$this->add_time = $time;
}
$this->update_time = $time;
return parent::beforeSave($insert);
}
public function afterSave($insert, $changedAttributes)
{
$this->service_friends = unserialize($this->service_friends);
}
public function afterFind ()
{
$this->service_friends = unserialize($this->service_friends);
return parent::afterFind();
}
}