I am making rest api in yii2. To update the timestamp and created_by,updated_by attributes while creating new record, I am using TimestampBehavior and BlameableBehavior as mentioned in the docs. I havent changed the default CreateAction class that yii2 is shipped with. What can be the reason? I am getting validation error "created_on" and "created_by" cannot be blank. Also when I debug and put a pointer inside beforeSave() of BaseActiveRecord, the method seems not to be called.
Notably the TimestampBehavior and BlameableBehavior are working fine while updating a record. "updated_on" and "updated_by" fields are correctly updated in this scenario.
The behavior in model is this:
public function behaviors()
{
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_on', 'updated_on'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_on'],
],
'value' => new Expression('NOW()'),
],
'blameable' => [
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'created_by',
'updatedByAttribute' => 'updated_by',
],
];
}
The CreateAction class (which I havent changed) looks like this:
class CreateAction extends Action
{
/**
* @var string the scenario to be assigned to the new model before it is validated and saved.
*/
public $scenario = Model::SCENARIO_DEFAULT;
/**
* @var string the name of the view action. This property is need to create the URL when the model is successfully created.
*/
public $viewAction = 'view';
/**
* Creates a new model.
* @return \yii\db\ActiveRecordInterface the model newly created
* @throws ServerErrorHttpException if there is any error when creating the model
*/
public function run()
{
if ($this->checkAccess) {
call_user_func($this->checkAccess, $this->id);
}
/* @var $model \yii\db\ActiveRecord */
$model = new $this->modelClass([
'scenario' => $this->scenario,
]);
$model->load(Yii::$app->getRequest()->getBodyParams(), '');
if ($model->save()) {
$response = Yii::$app->getResponse();
$response->setStatusCode(201);
$id = implode(',', array_values($model->getPrimaryKey(true)));
$response->getHeaders()->set('Location', Url::toRoute([$this->viewAction, 'id' => $id], true));
} elseif (!$model->hasErrors()) {
throw new ServerErrorHttpException('Failed to create the object for unknown reason.');
}
return $model;
}
}