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