Wenn Sie keine Vererbung verwenden möchten, kann ich die folgende Methode vorschlagen.
Der Grundgedanke dahinter ist mit Ereignissen von 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');
},
]);
}
});
}
Dieser Code dynamisch TimestampBehavior
für alle Modelle anbringt, die von yii\db\ActiveRecord
, bevor sie in die Datenbank übernommen werden zu speichern.
Sie können createdAtAttribute
und updatedAtAttribute
auch weglassen, weil sie bereits standardmäßig diese Namen haben (da es am häufigsten vorkommt).
Wie Sie sehen können, ist das Verhalten nur angefügt, wenn die Attribute created_at
und updated_at
vorhanden sind, es ist nicht notwendig, ein erweitertes Verhalten dafür zu erstellen.
Um Vererbung und Kopieren/Einfügen zu vermeiden, sollte dieser Code auf jedem Anwendungs-Bootstrap ausgeführt werden.
Sie können dies zum Eingabeskript (vor dem Ausführen der Anwendung) sofort hinzufügen und es wird funktionieren, aber es ist nicht ratsam, es hier zu platzieren, auch diese Dateien werden automatisch generiert und in git ignorierte Dateiliste.
Sie müssen also nur eine separate Komponente erstellen, die diese Logik enthält und sie in die Konfiguration aufnehmen. Keine Notwendigkeit, Klassen usw. zu erweitern.
Sagen wir es heißt common\components\EventBootstrap
. Es muss BootstrapInterface
implementieren, um ordnungsgemäß zu funktionieren.
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
}
}
Dann müssen Sie es in config in Bootstrap-Abschnitt enthalten:
return [
'bootstrap' => [
'common\components\EventBootstrap',
],
];
Offizielle Dokumentation:
Zusätzliche Hinweise: Ich habe auch versucht, es nur über die Anwendungskonfiguration anzugeben, aber ohne Erfolg.
Ich habe keinen Weg gefunden, dort anzugeben.
Sie können sehen this question, aber das Verhalten ist an die gesamte Anwendung angeschlossen, die über Config möglich ist.
Ist es im Wesentlichen für Sie es in Config tun? – arogachev
Ich kann es überall sonst machen, aber ich sehe nicht wo. Ich möchte kein Modell mit dem Verhalten machen, und dann alle Modelle von diesem erweitern – cku2014
@ cku2014 Warum nicht? Es ist der richtige Weg, es zu tun. – Masiorama