Помогите с поведением (behaviors)

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kaktus7702
Сообщения: 28
Зарегистрирован: 2016.09.18, 13:15

Помогите с поведением (behaviors)

Сообщение kaktus7702 »

Привет, помогите пожалуйста разобраться.
Есть модель, у нее есть свойство (int)date_time - в него записываю timestamp при создании новой записи.
Вот так это выглядит.

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

    public function behaviors()
    {
        return [
            'timestamp' => [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => 'date_time',
                ],
                'value' => function() { return date('U');  }, // unix timestamp
            ],                 
        ];
    }
Как тут видно в метод behaviors переназначен и в него добавлена конфигурация конфигурация .

Зачем указывать класс? Ведь по сути в value ничего связанного с этим классом не происходит. В атрибутах видно что в событии ActiveRecord::EVENT_BEFORE_INSERT из родительского класса назначаем свойству date_time значение value
и получается что при создании новой записи у нас вызывается функция анонимная функция, в ней определяется текущее время и записывается в date_time, и после этого у нас в базу записывается текущее время...(описал подробно для того что бы если вдруг я не верно представляю как это работает - что бы меня поправили). Так вот из всего сказанного)) зачем в конфигурации указывать класс?)

Спасибо)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Помогите с поведением (behaviors)

Сообщение zelenin »

kaktus7702 писал(а): 2017.06.22, 18:09 Привет, помогите пожалуйста разобраться.
Есть модель, у нее есть свойство (int)date_time - в него записываю timestamp при создании новой записи.
Вот так это выглядит.

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

    public function behaviors()
    {
        return [
            'timestamp' => [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => 'date_time',
                ],
                'value' => function() { return date('U');  }, // unix timestamp
            ],                 
        ];
    }
Как тут видно в метод behaviors переназначен и в него добавлена конфигурация конфигурация .

Зачем указывать класс? Ведь по сути в value ничего связанного с этим классом не происходит. В атрибутах видно что в событии ActiveRecord::EVENT_BEFORE_INSERT из родительского класса назначаем свойству date_time значение value
и получается что при создании новой записи у нас вызывается функция анонимная функция, в ней определяется текущее время и записывается в date_time, и после этого у нас в базу записывается текущее время...(описал подробно для того что бы если вдруг я не верно представляю как это работает - что бы меня поправили). Так вот из всего сказанного)) зачем в конфигурации указывать класс?)

Спасибо)

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

$config = [
    // 'class' => 'yii\db\Connection', // комментируем class
    'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

$db = Yii::createObject($config);
как из массива без class понять, какой объект мы хотим создать?
kaktus7702
Сообщения: 28
Зарегистрирован: 2016.09.18, 13:15

Re: Помогите с поведением (behaviors)

Сообщение kaktus7702 »

zelenin писал(а): 2017.06.22, 19:08 как из массива без class понять, какой объект мы хотим создать?
глобально я понял зачем классы)) что бы из них можно было вызывать сеттеры...
но вот конкретно мой пример... мне надо получить время - зачем мне класс в конфигурации если я просто вызываю нативную функцию php?)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Помогите с поведением (behaviors)

Сообщение zelenin »

kaktus7702 писал(а): 2017.06.22, 19:46
zelenin писал(а): 2017.06.22, 19:08 как из массива без class понять, какой объект мы хотим создать?
глобально я понял зачем классы)) что бы из них можно было вызывать сеттеры...
но вот конкретно мой пример... мне надо получить время - зачем мне класс в конфигурации если я просто вызываю нативную функцию php?)
вы не вызываете нативную функции - ее вызывает поведение, объект которой еще надо создать.
мне кажется или вы не понимаете вообще зачем сущещствуют классы и объекты?
kaktus7702
Сообщения: 28
Зарегистрирован: 2016.09.18, 13:15

Re: Помогите с поведением (behaviors)

Сообщение kaktus7702 »

zelenin писал(а): 2017.06.22, 19:57 вы не вызываете нативную функции - ее вызывает поведение, объект которой еще надо создать.
мне кажется или вы не понимаете вообще зачем сущещствуют классы и объекты?
вот в этой строке мы в событии EVENT_BEFORE_INSERT назначаем свойству date_time значение return date('U'); правлиьно??
поведение насколько я понимаю это набор конфигураций которые при создании объекта из класса добавляют ему какое то поведение, в данном случае вешают на событие переназначение свойства..
так вот в этом случае мы value назначаем с помощью из анонимной функции, не используя ни методы ни свойства класса который указан в конфигурации))

так вот зачем этот класс вообще объявляется?) если мы вообще никак его не используем
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Помогите с поведением (behaviors)

Сообщение ElisDN »

kaktus7702 писал(а): 2017.06.22, 20:45 вот в этой строке мы в событии EVENT_BEFORE_INSERT назначаем свойству date_time значение return date('U'); правлиьно??
Неправильно.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Помогите с поведением (behaviors)

Сообщение zelenin »

kaktus7702 писал(а): 2017.06.22, 20:45
zelenin писал(а): 2017.06.22, 19:57 вы не вызываете нативную функции - ее вызывает поведение, объект которой еще надо создать.
мне кажется или вы не понимаете вообще зачем сущещствуют классы и объекты?
вот в этой строке мы в событии EVENT_BEFORE_INSERT назначаем свойству date_time значение return date('U'); правлиьно??
в этой строке мы указываем, что поведение при событии объекта "before insert" должно присвоить свойству результат выполнения анонимной функции 'value'.
kaktus7702 писал(а): 2017.06.22, 20:45поведение насколько я понимаю это набор конфигураций которые при создании объекта из класса добавляют ему какое то поведение, в данном случае вешают на событие переназначение свойства..
поведение - это специальный класс объектов, вешаемых на события внутри моделей.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Помогите с поведением (behaviors)

Сообщение mkramer »

kaktus7702, неужели так сложно почитать класс TimestampBehavior, чтоб посмотреть, что там и как работает? Не говоря уж просто о документации.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Помогите с поведением (behaviors)

Сообщение zelenin »

mkramer писал(а): 2017.06.23, 13:36 kaktus7702, неужели так сложно почитать класс TimestampBehavior, чтоб посмотреть, что там и как работает? Не говоря уж просто о документации.
он не понимает зачем этот класс вообще нужен, и не видит его участия в процессе.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Помогите с поведением (behaviors)

Сообщение mkramer »

zelenin писал(а): 2017.06.23, 13:38
он не понимает зачем этот класс вообще нужен, и не видит его участия в процессе.
Ну когда я не понимаю, как работает фреймворк, у меня решение простое - Ctrl+click и в исходник. Не скажу, что прочёл весь код фреймворка, но в спорных ситуациях путешествовал.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Помогите с поведением (behaviors)

Сообщение mkramer »

Обычно не понимаешь, что происходит в твоей программе, начинаешь грешить на фреймворк, лезешь в него отладчиком - и оказывается, что ты сам дурак, естественно. Но если бы исходник фреймворка был закрыт, нахождение ошибки потребовало бы гораздо больше времени.
Ответить