In case you don't want to use inheritance I can suggest the following method.
The basic idea behind it is using events of ActiveRecord
:
use yii\base\Event;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
...
$events = [ActiveRecord::EVENT_BEFORE_INSERT, ActiveRecord::EVENT_BEFORE_UPDATE];
foreach ($events as $eventName) {
Event::on(ActiveRecord::className(), $eventName, function ($event) {
$model = $event->sender;
if ($model->hasAttribute('created_at') && $model->hasAttribute('updated_at')) {
$model->attachBehavior('timestamp', [
'class' => TimestampBehavior::className(),
'value' => function () {
return date('Y-m-d H:i:s');
},
]);
}
});
}
This code will dynamically attach TimestampBehavior
to all models which are inherited from yii\db\ActiveRecord
before saving it to database.
You can also omit createdAtAttribute
and updatedAtAttribute
because they already have these names by default (since it's most common).
As you can see behavior is attached only when both created_at
and updated_at
attributes exist, no need to create extended behavior for that.
To avoid inheritance and copy / paste this code should run on every application bootstrap.
You can add this to entry script (before application run) right away and it will work, but it's not good practice to place it here, also these files are generated automatically and in git ignored files list.
So you need to create just one separate component containing that logic and include it in the config. No need to extend classes etc.
Let's say it's called common\components\EventBootstrap
. It must implement BootstrapInterface
in order to work properly.
namespace common\components;
// Other namespaces from previous code
use yii\base\BootstrapInterface;
class EventBootstrap implements BootstrapInterface
{
public function bootstrap($app)
{
// Put the code above here
}
}
Then you need to include it in config in bootstrap section:
return [
'bootstrap' => [
'common\components\EventBootstrap',
],
];
Official documentation:
Additional notes: I also tried to specify it through the application config only, but with no success.
I didn't find a way to specify ActiveRecord
there.
You can see this question, but behavior there is attached to the whole application which is possible through config.
TimestampBehavior
? Manually or there is some kind of regularity? – SheepwalkTimestampBehavior
and i don't have those fields in my database. The i guess that i should create my on behavior, to extendTimestampBehavior
to check for those fields. Right? – Sternum