TimestampBehavior сломался

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

TimestampBehavior сломался

Сообщение Brainfuck »

Проекту и этой модели уже полгода, и все хорошо работало раньше, но внезапно TimestampBehavior сломался. В базу данных все время записываются нули в тех полях, где должно быть время. Я ничего не менял связанного с этим. Это похоже на баг где-то внутри фреймворка...

Важно! Я заметил в отладчике, что после сохранения модели поля дат не пустые!!! Но в базу данных все равно записываются нули. Это очень странно...

Вот моя модель:

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

/**
 * @property integer $id
 * @property integer $category_id
 * @property integer $user_id
 * @property integer $status_id
 * @property string $name
 * @property string $text
 * @property integer $created_at
 * @property integer $updated_at
 */
class Article extends ActiveRecord {
    public static function tableName() {
        return '{{%article}}';
    }

    public function behaviors() {
        return [
            'timestamp' => TimestampBehavior::class,
        ];
    }

    public function rules() {
        return [
            ['id', 'safe'],
            [['name', 'category_id'], 'required'],
            ['user_id', 'default', 'value' => Yii::$app->user->id],
        ];
    }
}
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: TimestampBehavior сломался

Сообщение urichalex »

created_at и updated_at в rules пропишите
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: TimestampBehavior сломался

Сообщение Brainfuck »

urichalex писал(а): 2018.03.22, 16:46 created_at и updated_at в rules пропишите
В комментарии к TimestampBehavior достаточно четко сказано этого не делать
Because attribute values will be set automatically by this behavior, they are usually not user input and should therefore
* not be validated, i.e. `created_at` and `updated_at` should not appear in the [[\yii\base\Model::rules()|rules()]] method of the model.
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: TimestampBehavior сломался

Сообщение urichalex »

Я пытался
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: TimestampBehavior сломался

Сообщение Brainfuck »

urichalex писал(а): 2018.03.22, 17:26 Я пытался
Это не помогает. Я пробовал.
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: TimestampBehavior сломался

Сообщение kawabanga »

Brainfuck писал(а): 2018.03.22, 17:51
urichalex писал(а): 2018.03.22, 17:26 Я пытался
Это не помогает. Я пробовал.
и не надо такое пробовать, неплохая такая уязвимость там.


1)Я бы посоветовал сначала проверить формат колонки, и данные которые вы в них записываете. скорее всего несостыковка там.

2)А потом просто исходя из формата в базе, вставлять в нужном варианте.

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

 'timestamp' => [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => 'created_ts',
                    ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_ts',
                    // ActiveRecord::EVENT_BEFORE_UPDATE => 'date_updated',
                ],
                'value' => function() { return time(); //
                },
            ],
Еще обратите внимание на то как вы сохраняете, возможно у вас там save(false) без валидации и триггеров.

3) ['user_id', 'default', 'value' => Yii::$app->user->id],
Я не уверен, но мне кажется этот атрибут можно переписать пользователю, подставив другие значения.

Используйте поведение, либо beforeSave()
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: TimestampBehavior сломался

Сообщение nickdenry »

Тоже самое произошло, что и у автора топика.
Ответственные программисты с высоким уровнем технического долга (c)
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: TimestampBehavior сломался

Сообщение Brainfuck »

kawabanga писал(а): 2018.03.22, 18:08
Brainfuck писал(а): 2018.03.22, 17:51
urichalex писал(а): 2018.03.22, 17:26 Я пытался
Это не помогает. Я пробовал.
и не надо такое пробовать, неплохая такая уязвимость там.


1)Я бы посоветовал сначала проверить формат колонки, и данные которые вы в них записываете. скорее всего несостыковка там.

2)А потом просто исходя из формата в базе, вставлять в нужном варианте.

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

 'timestamp' => [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => 'created_ts',
                    ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_ts',
                    // ActiveRecord::EVENT_BEFORE_UPDATE => 'date_updated',
                ],
                'value' => function() { return time(); //
                },
            ],
Еще обратите внимание на то как вы сохраняете, возможно у вас там save(false) без валидации и триггеров.

3) ['user_id', 'default', 'value' => Yii::$app->user->id],
Я не уверен, но мне кажется этот атрибут можно переписать пользователю, подставив другие значения.

Используйте поведение, либо beforeSave()
1. Нет. Говорю же все работало долгое время. Я не менял структуру таблицы. Поля для даты типа int.

2. Это все по умолчанию идет. Нет особого смысла прописывать так. Достаточно открыть исходники этого поведения. А атрибуты у меня также называются. И да, save(false) у меня. И что? На триггеры это не влияет. Это просто отключает валидацию. Но на поведения это тоже не влияет.

3. Вообще не понял что написано в этом предложении. Выражайтесь по русски пожалуйста. Очень непонятная формулировка.

Было бы странно использовать beforeSave если для этого как раз и придуманы поведения... Но если это и правда баг то возможно придется.
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: TimestampBehavior сломался

Сообщение someweb »

Yii 2.0.15.1 все работает.
Создайте gii новую модель + CRUD и попробуйте в ней.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: TimestampBehavior сломался

Сообщение Brainfuck »

someweb писал(а): 2018.03.23, 10:13 Yii 2.0.15.1 все работает.
Создайте gii новую модель + CRUD и попробуйте в ней.
У меня 2.0.14. И у меня нет времени новые модели клепать. Мне надо чтобы в этой заработало.
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: TimestampBehavior сломался

Сообщение Brainfuck »

И кстати я обновился до 2.0.15 и это проблему не исправило
mexanik
Сообщения: 5
Зарегистрирован: 2018.03.22, 23:13

Re: TimestampBehavior сломался

Сообщение mexanik »

так если в php после сохранения данные есть, значит либо их мускуль не принял, либо вы его не отдали мускулю
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: TimestampBehavior сломался

Сообщение Brainfuck »

mexanik писал(а): 2018.03.23, 12:26 так если в php после сохранения данные есть, значит либо их мускуль не принял, либо вы его не отдали мускулю
<сарказм>Очень информативно, спасибо!</сарказм>
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: TimestampBehavior сломался

Сообщение dmg »

Посмотрите в дебаге команду sql с сохранением вашей модели. Попробуйте её напрямую базу отправить
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: TimestampBehavior сломался

Сообщение Auramel »

мб поможет
поля только на свои поменяйте (createdAt => created_at) и т.д.

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

/**
     * @return array
     */
    public function behaviors(): array
    {
        return [
            [
                'class'                 => \yii\behaviors\TimestampBehavior::class,
                'createdAtAttribute'    => 'createdAt',
                'updatedAtAttribute'    => 'updatedAt',
                'value'                 => time()
            ]
        ];
    }
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: TimestampBehavior сломался

Сообщение kawabanga »

так если в php после сохранения данные есть, значит либо их мускуль не принял, либо вы его не отдали мускулю
У него нет времени разбираться и открыть дебаг, код должен работать!



Было бы странно использовать beforeSave если для этого как раз и придуманы поведения... Но если это и правда баг то возможно придется.
Проверьте может я не прав. Создайте форму, где вы ставить произвольный user_id, и загружаете через load(). Атрибут после обработки default по идее будет считаться безопасным и разрешенным к присваиванию.
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: TimestampBehavior сломался

Сообщение Brainfuck »

Короче я разобрался. Проблема была в чертовом неочевидном поведении этой дурацкой инфраструктуры! Уже не первый раз из-за неочевидности проблемы возникают. Я сохранял "save(true, ['name', 'category_id', 'user_id', 'status_id'])", но я думал что массив атрибутов указывает здесь на то какие из них надо валидировать (как в методе validate)! Потому что первым параметром идет флаг - валидировать модель или нет. Это же так логично! Но внезапно оказывается что массив там указывает на то какие атрибуты будут сохранены. (=_=) Нахрена это вообще нужно я не понимаю...
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: TimestampBehavior сломался

Сообщение andku83 »

Brainfuck писал(а): 2018.03.23, 17:15 ... но я думал что массив атрибутов указывает здесь на то какие из них надо валидировать (как в методе validate)! Потому что первым параметром идет флаг - валидировать модель или нет. Это же так логично! ...
это по-вашему "логично", а по-моему если использовать какие-то параметры нужно посмотреть что это за параметр, а не предполагать на основании своей логики.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: TimestampBehavior сломался

Сообщение maleks »

Brainfuck писал(а): 2018.03.23, 17:15 Но внезапно оказывается что массив там указывает на то какие атрибуты будут сохранены.
Так это всегда так было, непонятно как у вас "все хорошо работало раньше" (C)

И я бы не игнорировал что вам выше говорили про то как вы используете default (да и safe) валидаторы. Без кода из контроллера наверняка не скажешь, есть ли там массовое заполнение данными от пользователя, но выглядит очень подозрительно.
Yii2 universal module sceleton - for basic and advanced templates
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: TimestampBehavior сломался

Сообщение nickdenry »

У меня были переопределены get set для дат, видимо, это стало работать иначе с самим поведением. Без get, set все работает как должно.
Ответственные программисты с высоким уровнем технического долга (c)
Ответить