Страница 1 из 1
Поведение AttributeBehavior
Добавлено: 2014.05.05, 09:33
chungachguk
Код: Выделить всё
public function behaviors()
{
return [
'attribute' => [
'class' => AttributeBehavior::className(),
'value' => function(Event $event) {return Yii::$app->user->id;},
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['user_id', 'created_by', 'updated_by'],
ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_by',
],
]
];
}
Есть ли возможность узнать внутри замыкания, на каком аттрибуте оно было вызвано? (Без создания нового поведения на основе AttributeBehavior)
Re: Поведение AttributeBehavior
Добавлено: 2014.05.05, 16:04
zelenin
Код: Выделить всё
public function behaviors()
{
return [
'attribute' => [
'class' => AttributeBehavior::className(),
'value' => function(Event $event) {return Yii::$app->user->id;},
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_by', 'updated_by'],
ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_by',
],
],
'user_id' => [
'class' => AttributeBehavior::className(),
'value' => function(Event $event) {return Yii::$app->user->id;},
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['user_id'],
],
]
];
}
вот так можно сделать.
а вообще задачу скажите, найдем решение.
Re: Поведение AttributeBehavior
Добавлено: 2014.05.06, 05:43
chungachguk
Задача банальна. Если в форме отправки значение атрибута уже установлено, то поведение ничего не должно делать, в противном случае - заполнить его значением из getValue.
Re: Поведение AttributeBehavior
Добавлено: 2014.05.06, 09:44
zelenin
chungachguk писал(а):Задача банальна. Если в форме отправки значение атрибута уже установлено, то поведение ничего не должно делать, в противном случае - заполнить его значением из getValue.
можно сделать как я написал, можно написать свое поведение, думаю прокатит и третий вариант:
Код: Выделить всё
'value' => !empty( $this->user_id ) ? $this->user_id : function(Event $event) {return Yii::$app->user->id;},
Re: Поведение AttributeBehavior
Добавлено: 2014.05.06, 12:48
chungachguk
спасибо за варианты, но нагляднее видимо будет создавать новое поведение
Re: Поведение AttributeBehavior
Добавлено: 2014.05.06, 23:39
vladqa
chungachguk писал(а):спасибо за варианты, но нагляднее видимо будет создавать новое поведение
А не лучше ли в вашем случае просто воспользоваться DefaultValueValidator'ом ?
PS: юзать Yii::$app->user в модели - плохая практика. Лучше устанавливайте это значение в сервисе, который эти самые модели создает/сохраняет.
Иначе получите проблемы, если начнете юзать модель вне web-окружения. Например, из консоли.
Re: Поведение AttributeBehavior
Добавлено: 2014.05.07, 06:50
chungachguk
vladqa писал(а):
PS: юзать Yii::$app->user в модели - плохая практика. Лучше устанавливайте это значение в сервисе, который эти самые модели создает/сохраняет.
Иначе получите проблемы, если начнете юзать модель вне web-окружения. Например, из консоли.
А с этого места можно поподробнее?
Re: Поведение AttributeBehavior
Добавлено: 2014.05.07, 10:20
vladqa
chungachguk писал(а):vladqa писал(а):
PS: юзать Yii::$app->user в модели - плохая практика. Лучше устанавливайте это значение в сервисе, который эти самые модели создает/сохраняет.
Иначе получите проблемы, если начнете юзать модель вне web-окружения. Например, из консоли.
А с этого места можно поподробнее?
Yii::$app->user возвращает экземпляр класса User, который является компонентом, который, в свою очередь определен только для \yii\web\Application, то есть, только для веб-приложения.
Это логично, потому что User использует web-окружение (куки, сессию, etc..)
Если вы захотите работать с вашей моделью из другого окружения (например, выполняя что-то по крону через php-cli), то вас ждет ошибка, т.к. в \yii\console\Application нет такого компонента и нет никакого окружения.
Тут два варианта: сделать компонент-заглушку User для таких случаев или просто убрать все обращения к User из модели, что более правильно, т.к. модель не должна зависеть от окружения, т.к. она находится на более низком уровне.
Re: Поведение AttributeBehavior
Добавлено: 2014.10.26, 16:55
ifelse
Прошу прощение за поднятие старой темы. К примеру я хочу сохранять какую либо информацию о пользователе, будь то его ID или IP-адрес - лучше делать это в контроллере?
Re: Поведение AttributeBehavior
Добавлено: 2014.10.26, 18:29
zelenin
ifelse писал(а):Прошу прощение за поднятие старой темы. К примеру я хочу сохранять какую либо информацию о пользователе, будь то его ID или IP-адрес - лучше делать это в контроллере?
в поведении, навешенном на какое-то событие.
Re: Поведение AttributeBehavior
Добавлено: 2014.10.26, 18:45
ifelse
Ну так а как быть с проблемой окружений, описанная выше?
Re: Поведение AttributeBehavior
Добавлено: 2014.10.26, 18:50
zelenin
ifelse писал(а):Ну так а как быть с проблемой окружений, описанная выше?
какая проблема у вас?
Re: Поведение AttributeBehavior
Добавлено: 2017.10.25, 12:33
VaNnOrus
zelenin писал(а): ↑2014.10.26, 18:50
ifelse писал(а):Ну так а как быть с проблемой окружений, описанная выше?
какая проблема у вас?
Видимо, имелось в виду как быть с тем, что использовать $app->user в моделе не по фэншую, так как это может вызвать ошибки при работе с консоли, например.
Собственно, тот же вопрос возник. Пока что сделал
Код: Выделить всё
((isset(\Yii::$app->user)) ? \Yii::$app->user->getId() : 0)
но как-то сомнительно
Re: Поведение AttributeBehavior
Добавлено: 2017.10.25, 12:50
zelenin
VaNnOrus писал(а): ↑2017.10.25, 12:33
zelenin писал(а): ↑2014.10.26, 18:50
ifelse писал(а):Ну так а как быть с проблемой окружений, описанная выше?
какая проблема у вас?
Видимо, имелось в виду как быть с тем, что использовать $app->user в моделе не по фэншую, так как это может вызвать ошибки при работе с консоли, например.
Собственно, тот же вопрос возник. Пока что сделал
Код: Выделить всё
((isset(\Yii::$app->user)) ? \Yii::$app->user->getId() : 0)
но как-то сомнительно
Yii::$app->user - это компонент по аутентификации юзера. В консоли оно не имеет смысла, и потому нет. Разрабатывать функциональность нужно с учетом этого.
Re: Поведение AttributeBehavior
Добавлено: 2017.10.25, 13:51
VaNnOrus
zelenin писал(а): ↑2017.10.25, 12:50
VaNnOrus писал(а): ↑2017.10.25, 12:33
zelenin писал(а): ↑2014.10.26, 18:50
какая проблема у вас?
Видимо, имелось в виду как быть с тем, что использовать $app->user в моделе не по фэншую, так как это может вызвать ошибки при работе с консоли, например.
Собственно, тот же вопрос возник. Пока что сделал
Код: Выделить всё
((isset(\Yii::$app->user)) ? \Yii::$app->user->getId() : 0)
но как-то сомнительно
Yii::$app->user - это компонент по аутентификации юзера. В консоли оно не имеет смысла, и потому нет. Разрабатывать функциональность нужно с учетом этого.
Оно и понятно. Вот я и разработал - если юзера нет проставить "0"
Re: Поведение AttributeBehavior
Добавлено: 2017.10.25, 14:08
zelenin
VaNnOrus писал(а): ↑2017.10.25, 13:51
zelenin писал(а): ↑2017.10.25, 12:50
VaNnOrus писал(а): ↑2017.10.25, 12:33
Видимо, имелось в виду как быть с тем, что использовать $app->user в моделе не по фэншую, так как это может вызвать ошибки при работе с консоли, например.
Собственно, тот же вопрос возник. Пока что сделал
Код: Выделить всё
((isset(\Yii::$app->user)) ? \Yii::$app->user->getId() : 0)
но как-то сомнительно
Yii::$app->user - это компонент по аутентификации юзера. В консоли оно не имеет смысла, и потому нет. Разрабатывать функциональность нужно с учетом этого.
Оно и понятно. Вот я и разработал - если юзера нет проставить "0"
ну тогда что тут сомнительного? Ставишь задачу - задачу решаешь.