在yii2中实现TimestampBehavior时出错

时间:2015-10-27 06:32:41

标签: yii2

在activerecord类中我把这段代码

use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;

public function behaviors()
{
  return [
    'class' => TimestampBehavior::className(),
        'attributes' => [
           ActiveRecord::EVENT_BEFORE_INSERT => ['create_time'],
           ActiveRecord::EVENT_BEFORE_UPDATE => ['create_time'],
    ],
  ];
}

但它给我一个错误

Invalid Configuration – yii\base\InvalidConfigException
Object configuration must be an array containing a "class" element.

我不知道我在哪里做错了。
我也按照这个链接 TimestampBehavior is not working in Yii2 但这也无法解决我的问题。

2 个答案:

答案 0 :(得分:2)

以下是更正后的版本:

public function behaviors()
{
    return [
        [
            'class' => TimestampBehavior::className(),
            'attributes' => [
               ActiveRecord::EVENT_BEFORE_INSERT => ['create_time'],
               ActiveRecord::EVENT_BEFORE_UPDATE => ['create_time'],
            ],
        ],
    ];
}

这是更深入的解释。

主要问题是你忘了将行为配置包装到自己的数组中,这就是抛出错误的原因。此配置与所有其他配置由Yii::createObject()方法处理。所以你需要包含至少class元素的数组。如果您需要默认配置,只需指定类名即可省略此选项,例如:

public function behaviors()
{
    return [
        TimestampBehavior::className(),            
    ],
  ];
}

除此之外,你也忘了在属性后关闭方括号。

最后,你不应该指定那样的属性。就像在这种行为的初始阶段那样,它被重构了。现在您只需要指定相应的属性名称,例如:

public function behaviors()
{
    return [
        [
            'class' => TimestampBehavior::className(),
            'createdAtAttribute' => 'created_at', // This is by default, you can omit that
            'updatedAtAttribute' => 'updated_at', // This is by default, you can omit that
        ],
    ],
  ];
}

此外,我不认为使用相同的列来跟踪createupdate时间是一个好主意。

此外,您可以指定用于更新这些列的value

use yii\db\Expression;

...

'value' => new Expression('NOW()'),

这将涉及数据库来计算时间,如果你想通过PHP在服务器端这样做,你可以使用闭包,例如:

'value' => function () {
    return date('Y-m-d H:i:s');
}

还有一件事,即使它与此问题没有直接关系 - 您可以通过设置配置数组的键来为每个行为设置别名。这称为命名行为:

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

@GAMITG在回答中提到了这一点。

答案 1 :(得分:1)

您可以尝试使用此代码。

public function behaviors()
{   
    return [
          'timestamp' => [
            'class' => 'yii\behaviors\TimestampBehavior',
            'attributes' => [
                ActiveRecord::EVENT_BEFORE_INSERT => ['create_time'],
                ActiveRecord::EVENT_BEFORE_UPDATE => ['create_time'],
            ],
          ],
    ];
}