в чем преимущество использования геттеров в WebUser?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Dreammaker
Сообщения: 139
Зарегистрирован: 2009.09.02, 16:21
Откуда: Черкассы, Украина

в чем преимущество использования геттеров в WebUser?

Сообщение Dreammaker »

Нам нужно получить роль пользователь для того, чтобы знать редиректить ли его с определённых страниц на другие. Для этого мы делаем класс WEbUser

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

<?php

class WebUser extends CWebUser
{
        private $_model;
 
        // Return role type.
        function getRoleType()
        {
                $criteria = new CDbCriteria;
                $criteria->condition = 't.id = :id';
                $criteria->params = array(':id'=>Yii::app()->user->id);
                $criteria->select = 'username, email';
                $user = User::model()->with('role')->find($criteria);
                
                $role = $user->role;
                
                return $role->type;
        }
} 
В чем будет преимущество доступа к роли в виде Yii::app()->user->RoleType вместо Yii::app()->user->getRoleType() ?


или разницы нет, почему тогда используется Yii::app()->user->username, Yii::app()->user->id и т.д.?
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: в чем преимущество использования геттеров в WebUser?

Сообщение taral14 »

Во первых вопрос не имеет отношение с WebUser. Скорее это к самому фреймфорку. Поскольку такая работа с get функциями описана в базовом классе CComponent. Именно там описано что если запрашивается свойство обьекта которое не существует будет запрошен метод getНазваниеСвойства. Если такой метод существует будет возвращен его результат. Потому запрашивая RoleType вы запрашиваете getRoleType()
Dreammaker
Сообщения: 139
Зарегистрирован: 2009.09.02, 16:21
Откуда: Черкассы, Украина

Re: в чем преимущество использования геттеров в WebUser?

Сообщение Dreammaker »

Вопрос об абсолютно противоположном. Зачем запрашивать RoleType, если есть getRoleType()? That is the question! :)
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: в чем преимущество использования геттеров в WebUser?

Сообщение taral14 »

Вопрос об абсолютно противоположном. Зачем запрашивать RoleType, если есть getRoleType()? That is the question!
Мм ну я обьяснил как строено это. А зная как оно устроено совершенно ясно зачем это сделано. Потому запрашивать RoleType можно потому что
1. Так можно :)
2. Вы можете перед возвратом обработать данные. Для конкретно этого примера показать сложно будет. Но к примеру у юзера есть поля Name и Surname. Пишем getFullName() {return $this->Name.' '.$this->Surname}
3. Yii::app()->user->RoleType выглядит лучше и короче чем Yii::app()->user->getRoleType()
4. Думаю можно придумать еще удобное применение.
Если на этом примере это не так заметно то вот
Yii::app()->getController()->getAction()->getId();
Yii::app()->Controller->Action->Id;
Хотите используйте хотите нет.
Dreammaker
Сообщения: 139
Зарегистрирован: 2009.09.02, 16:21
Откуда: Черкассы, Украина

Re: в чем преимущество использования геттеров в WebUser?

Сообщение Dreammaker »

>Хотите используйте хотите нет.

Ну я и использую :) Но вот сейчас помогаю программисту изучить Yii, и возник вот такой вот вопрос, на который я не могу дать ответ полноценный. То есть, я воспринимаю это как данность вижу удобство субъективное для себя, а вот объяснить не получается.
like2dev
Сообщения: 138
Зарегистрирован: 2011.05.13, 12:57
Откуда: Kiev

Re: в чем преимущество использования геттеров в WebUser?

Сообщение like2dev »

getRoleType() - будет работать быстрее.
roleType - используют, чисто ради красоты кода.
Yii::app()->user->name - используют потому что у компонента CWebUser в магическом методе __get стоит проверка, есть ли данное свойство в сессии, если да то возвращаем его. Вроде на все ответил.
Dreammaker
Сообщения: 139
Зарегистрирован: 2009.09.02, 16:21
Откуда: Черкассы, Украина

Re: в чем преимущество использования геттеров в WebUser?

Сообщение Dreammaker »

like2dev писал(а):
Yii::app()->user->name - используют потому что у компонента CWebUser в магическом методе __get стоит проверка, есть ли данное свойство в сессии, если да то возвращаем его.

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

 public function __get($name)
        {
                if($this->hasState($name))
                        return $this->getState($name);
                else
                        return parent::__get($name);
        } 
Если я не ошибаюсь $name здесь касается не Yii::app()->user->name, а имени любой переменной. То есть, значит возникает преимущество, что если если мы обращаемся к какой-то переменной через геттер, то проверяется хранится ли значение переменной в сессии. Это уже значительное преимущество - не нужно лишний раз дёргать базу.

p.s. Хотя...
Note, when cookie-based authentication is enabled, all these persistent data will be stored in cookie. Therefore, do not store password or other sensitive data in the persistent storage. Instead, you should store them directly in session on the server side if needed.
Так что не все так радужно :)
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: в чем преимущество использования геттеров в WebUser?

Сообщение taral14 »

То есть, значит возникает преимущество, что если если мы обращаемся к какой-то переменной через геттер
Преимущество не возникает. Есть данные которые стоит хранить через сессию, есть те что стоит хранить через геттер. На примере CWebUser роль стоит описывать через геттер. Так же как и состояние пользователя (активен, забанен). По той причине если администратор отредактирует пользователя и забанит его пользователь все равно сможет заходить на сайт пока не переавторизируется. Что плохо.
getRoleType() - будет работать быстрее.
Скорость работы на столько слабо отличается что про это вообще не стоило упоминать. Не знающих людей только запутает.
Но вот сейчас помогаю программисту изучить Yii, и возник вот такой вот вопрос, на который я не могу дать ответ полноценный. То есть, я воспринимаю это как данность вижу удобство субъективное для себя, а вот объяснить не получается.
А что тут вообще объяснять. Это удобно вот и все. Никаких преимуществ это не может давать перед использованием getFunctionName(). Все только чисто визуально. Код более красив и это прекрасно.
Dreammaker
Сообщения: 139
Зарегистрирован: 2009.09.02, 16:21
Откуда: Черкассы, Украина

Re: в чем преимущество использования геттеров в WebUser?

Сообщение Dreammaker »

taral14 писал(а): Есть данные которые стоит хранить через сессию, есть те что стоит хранить через геттер. На примере CWebUser роль стоит описывать через геттер. Так же как и состояние пользователя (активен, забанен). По той причине если администратор отредактирует пользователя и забанит его пользователь все равно сможет заходить на сайт пока не переавторизируется. Что плохо.
наверное, имелось в виду, что не стоит описывать через CWebUser?
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: в чем преимущество использования геттеров в WebUser?

Сообщение taral14 »

наверное, имелось в виду, что не стоит описывать через CWebUser?
Не понял фразу
Dreammaker
Сообщения: 139
Зарегистрирован: 2009.09.02, 16:21
Откуда: Черкассы, Украина

Re: в чем преимущество использования геттеров в WebUser?

Сообщение Dreammaker »

Я опечатался.

[quote]На примере CWebUser роль стоит описывать через геттер. [quote]

Может не стоит? или я опять что-то не понимаю? :)
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: в чем преимущество использования геттеров в WebUser?

Сообщение taral14 »

Нет наоборот стоит. Потому что если мы ее не через геттер сделаем то она не будет братся с базы при каждом заходе на страницу. А если не будет браться, то если юзер авторизирован и мы в базе изменили его роль. К примеру с администратора сменили на обычного юзера у него в сессии останется то что он админ. А нам это не нужно.
Dreammaker
Сообщения: 139
Зарегистрирован: 2009.09.02, 16:21
Откуда: Черкассы, Украина

Re: в чем преимущество использования геттеров в WebUser?

Сообщение Dreammaker »

через геттер имеется в виду через метод, а не через свойство?
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: в чем преимущество использования геттеров в WebUser?

Сообщение taral14 »

Да. Когда я говорил через геттер имелось в виду через getRoleType
Ответить