Поведение AttributeBehavior

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Поведение AttributeBehavior

Сообщение 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)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Поведение AttributeBehavior

Сообщение 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'],
                ],
            ]
        ];
    }
вот так можно сделать.
а вообще задачу скажите, найдем решение.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Поведение AttributeBehavior

Сообщение chungachguk »

Задача банальна. Если в форме отправки значение атрибута уже установлено, то поведение ничего не должно делать, в противном случае - заполнить его значением из getValue.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Поведение AttributeBehavior

Сообщение zelenin »

chungachguk писал(а):Задача банальна. Если в форме отправки значение атрибута уже установлено, то поведение ничего не должно делать, в противном случае - заполнить его значением из getValue.
можно сделать как я написал, можно написать свое поведение, думаю прокатит и третий вариант:

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

'value' => !empty( $this->user_id ) ? $this->user_id : function(Event $event) {return Yii::$app->user->id;},
 
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Поведение AttributeBehavior

Сообщение chungachguk »

спасибо за варианты, но нагляднее видимо будет создавать новое поведение
vladqa
Сообщения: 30
Зарегистрирован: 2013.02.01, 19:18

Re: Поведение AttributeBehavior

Сообщение vladqa »

chungachguk писал(а):спасибо за варианты, но нагляднее видимо будет создавать новое поведение
А не лучше ли в вашем случае просто воспользоваться DefaultValueValidator'ом ?

PS: юзать Yii::$app->user в модели - плохая практика. Лучше устанавливайте это значение в сервисе, который эти самые модели создает/сохраняет.
Иначе получите проблемы, если начнете юзать модель вне web-окружения. Например, из консоли.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Поведение AttributeBehavior

Сообщение chungachguk »

vladqa писал(а): PS: юзать Yii::$app->user в модели - плохая практика. Лучше устанавливайте это значение в сервисе, который эти самые модели создает/сохраняет.
Иначе получите проблемы, если начнете юзать модель вне web-окружения. Например, из консоли.
А с этого места можно поподробнее?
vladqa
Сообщения: 30
Зарегистрирован: 2013.02.01, 19:18

Re: Поведение AttributeBehavior

Сообщение 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 из модели, что более правильно, т.к. модель не должна зависеть от окружения, т.к. она находится на более низком уровне.
Аватара пользователя
ifelse
Сообщения: 227
Зарегистрирован: 2013.02.05, 13:05

Re: Поведение AttributeBehavior

Сообщение ifelse »

Прошу прощение за поднятие старой темы. К примеру я хочу сохранять какую либо информацию о пользователе, будь то его ID или IP-адрес - лучше делать это в контроллере?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Поведение AttributeBehavior

Сообщение zelenin »

ifelse писал(а):Прошу прощение за поднятие старой темы. К примеру я хочу сохранять какую либо информацию о пользователе, будь то его ID или IP-адрес - лучше делать это в контроллере?
в поведении, навешенном на какое-то событие.
Аватара пользователя
ifelse
Сообщения: 227
Зарегистрирован: 2013.02.05, 13:05

Re: Поведение AttributeBehavior

Сообщение ifelse »

Ну так а как быть с проблемой окружений, описанная выше?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Поведение AttributeBehavior

Сообщение zelenin »

ifelse писал(а):Ну так а как быть с проблемой окружений, описанная выше?
какая проблема у вас?
Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Поведение AttributeBehavior

Сообщение VaNnOrus »

zelenin писал(а): 2014.10.26, 18:50
ifelse писал(а):Ну так а как быть с проблемой окружений, описанная выше?
какая проблема у вас?
Видимо, имелось в виду как быть с тем, что использовать $app->user в моделе не по фэншую, так как это может вызвать ошибки при работе с консоли, например.
Собственно, тот же вопрос возник. Пока что сделал

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

((isset(\Yii::$app->user)) ? \Yii::$app->user->getId() : 0)
но как-то сомнительно :|
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Поведение AttributeBehavior

Сообщение 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 - это компонент по аутентификации юзера. В консоли оно не имеет смысла, и потому нет. Разрабатывать функциональность нужно с учетом этого.
Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Поведение AttributeBehavior

Сообщение 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" :)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Поведение AttributeBehavior

Сообщение 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" :)
ну тогда что тут сомнительного? Ставишь задачу - задачу решаешь.
Ответить