существует ли UserFactory ?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
AvtoNom
Сообщения: 9
Зарегистрирован: 2012.06.09, 20:32

существует ли UserFactory ?

Сообщение AvtoNom »

Пытаюсь разобраться как создать объект User для нужного мне id ?

Я привык это делать так:

Код: Выделить всё

$User = UserFactory::createById(12345);
$User->getShardId();
т.е. я хочу получить объект который не содержит лишних методов как есть в CWebUser: ...Login, ..Flash, ...
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: существует ли UserFactory ?

Сообщение R3D3 »

Если вы хотите достать пользователя из бд, например из таблицы `user`, и ей соответствует модель User, то

Код: Выделить всё

$user = User::model()->findByPk($id);
 
Yii Jabber Conference: yii@conference.jabber.ru
AvtoNom
Сообщения: 9
Зарегистрирован: 2012.06.09, 20:32

Re: существует ли UserFactory ?

Сообщение AvtoNom »

R3D3 писал(а):Если вы хотите достать пользователя из бд, например из таблицы `user`, и ей соответствует модель User, то

Код: Выделить всё

$user = User::model()->findByPk($id);
нет нет, это не просто данные из БД, а класс с набором методов работающих с Юзером.
Есть модель User, но я бы идеологически это модель Profile т.к. идет обработка записей профиля в БД
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: существует ли UserFactory ?

Сообщение R3D3 »

AvtoNom писал(а): нет нет, это не просто данные из БД, а класс с набором методов работающих с Юзером.
Есть модель User, но я бы идеологически это модель Profile т.к. идет обработка записей профиля в БД
Ну опять же, пользователь это не абстрактная штука, а как минимум запись в таблице БД. Так что все эти методы лучше расположить в классе User (или в классе Profile, если для профиля отдельная таблица).
Если же эти методы действуют в контексте текущей сессии пользователя, то их лучше разместить в наследнике CWebUser.

Приведите несколько примеров таких методов, тогда станет понятнее где их лучше размещать.
Yii Jabber Conference: yii@conference.jabber.ru
AvtoNom
Сообщения: 9
Зарегистрирован: 2012.06.09, 20:32

Re: существует ли UserFactory ?

Сообщение AvtoNom »

R3D3 писал(а): Приведите несколько примеров таких методов, тогда станет понятнее где их лучше размещать.
Конкретно сейчас пытаюсь понять куда засунуть метод определения Шарда по id юзера:

Код: Выделить всё

    public function getShardId(){
        return floor($this->getId()/$this->countUserInShard)+1;
    }
что бы потом в цикле создавать объекты User по id, получать от них ShardId и ник.
AvtoNom
Сообщения: 9
Зарегистрирован: 2012.06.09, 20:32

Re: существует ли UserFactory ?

Сообщение AvtoNom »

На данный момент попытался создать компонент UserObject

Код: Выделить всё

class UserObject extends CApplicationComponent implements IWebUser
но оказалось не решением т.к. getId использует $_SESSION

Код: Выделить всё

    public function getId()
    {
        return $this->getState('__id');
    }

        public function getState($key,$defaultValue=null)
       {
           $key=$this->getStateKeyPrefix().$key;
           return isset($_SESSION[$key]) ? $_SESSION[$key] : $defaultValue;
       }
 
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: существует ли UserFactory ?

Сообщение R3D3 »

AvtoNom писал(а):На данный момент попытался создать компонент UserObject

Код: Выделить всё

class UserObject extends CApplicationComponent implements IWebUser
но оказалось не решением т.к. getId использует $_SESSION

Код: Выделить всё

    public function getId()
    {
        return $this->getState('__id');
    }

        public function getState($key,$defaultValue=null)
       {
           $key=$this->getStateKeyPrefix().$key;
           return isset($_SESSION[$key]) ? $_SESSION[$key] : $defaultValue;
       }
Что-то не то имхо, обычно нет необходимости создавать дополнительный объект, реализующий IWebUser
Конкретно сейчас пытаюсь понять куда засунуть метод определения Шарда по id юзера:
По-моему тут ответ однозначный: поскольку в вычислении участвует id пользователя, то этот метод должен располагаться в модели User.
Yii Jabber Conference: yii@conference.jabber.ru
AvtoNom
Сообщения: 9
Зарегистрирован: 2012.06.09, 20:32

Re: существует ли UserFactory ?

Сообщение AvtoNom »

пока нужен один метод оставлю его в модели User.
Вот только не получается через main.php передать значение в модели User.

Код: Выделить всё

        'user'=>array(
            'class'=>'User',
            'countUserInShard'=>1000,
        ),
 
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: существует ли UserFactory ?

Сообщение R3D3 »

AvtoNom писал(а):пока нужен один метод оставлю его в модели User.
Вот только не получается через main.php передать значение в модели User.

Код: Выделить всё

        'user'=>array(
            'class'=>'User',
            'countUserInShard'=>1000,
        ),
 
Не не не, это совсем не то. Нельзя ставить класс User extends CActiveRecord в качестве компонента user. Лучше так:

Код: Выделить всё

        'user'=>array(
            'class'=>'WebUser',
            'countUserInShard'=>1000,
        ),
где WebUser это свой кастомный класс, который наследует CWebUser и имеет публичное свойство $countUserInShard.
А в модели User уже обращаемся к нему так:

Код: Выделить всё

....
public function getShardId(){
        return floor($this->id/Yii::app()->user->countUserInShard)+1;
    }
Yii Jabber Conference: yii@conference.jabber.ru
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: существует ли UserFactory ?

Сообщение R3D3 »

И вообще, зачем так извращаться и использовать WebUser тут? countUserInShard это по сути константа и меняться не будет, так вот и забей ее в класс User как обычную константу.
Yii Jabber Conference: yii@conference.jabber.ru
Аватара пользователя
radamir
Сообщения: 142
Зарегистрирован: 2009.08.10, 08:02
Откуда: Новосибирск

Re: существует ли UserFactory ?

Сообщение radamir »

Какую задачу ты перед собой ставишь? Что такое "shardId"? Определение и назначение?
AvtoNom
Сообщения: 9
Зарегистрирован: 2012.06.09, 20:32

Re: существует ли UserFactory ?

Сообщение AvtoNom »

radamir писал(а):Какую задачу ты перед собой ставишь? Что такое "shardId"? Определение и назначение?
AvtoNom писал(а): Конкретно сейчас пытаюсь понять куда засунуть метод определения Шарда по id юзера. что бы потом в цикле создавать объекты User по id, получать от них ShardId и ник.
Пусть даже элементарно получить аватарку с проверкой существования ->getAvatar();
Ответить