Programmieren mit Yii2 Timestamp-Verhalten

Was Sie erstellen werden

Wenn Sie fragen: "Was ist Yii?" Schauen Sie sich mein früheres Tutorial an: Einführung in das Yii-Framework, Hier werden die Vorteile von Yii beschrieben und ein Überblick über die Neuerungen in Yii 2.0 (Oktober 2014) gegeben.

In dieser Programmierserie mit Yii2 leite ich die Leser beim Einsatz des neu aktualisierten Yii2-Frameworks für PHP. In diesem Lernprogramm werden Timestamp-Verhalten untersucht. Dadurch wird die Menge an Code reduziert, die Sie mit jedem neuen Modell schreiben müssen, um Zeitstempel für Einfügungen und Aktualisierungen zu erstellen. Wir werden auch in den Quellcode von Yii2 eintauchen und untersuchen, wie ein Verhalten implementiert wird.

Für die Beispiele in diesem Lernprogramm stellen wir uns weiterhin vor, dass wir ein Framework für die Veröffentlichung einfacher Statusaktualisierungen erstellen, z. unser eigenes Mini-Twitter.

Nur zur Erinnerung, ich beteilige mich an den Kommentarthreads unten. Ich bin besonders interessiert, wenn Sie unterschiedliche Ansätze, zusätzliche Ideen haben oder Themen für zukünftige Tutorials vorschlagen möchten.

Was ist ein Verhalten??

Yii2 Verhalten sind im Wesentlichen Mixins. Wikipedia beschreibt Mixins als "eine Klasse, die eine Kombination von Methoden aus anderen Klassen enthält. Wie eine solche Kombination durchgeführt wird, hängt von der Sprache ab, jedoch nicht von Vererbung."

Yii beschreibt sie so:

Durch das Anhängen eines Verhaltens an eine Komponente werden die Methoden und Eigenschaften des Verhaltens in die Komponente eingefügt, wodurch diese Methoden und Eigenschaften so zugänglich gemacht werden, als wären sie in der Komponentenklasse selbst definiert.

Yii2 bietet mehrere integrierte Verhaltensweisen, von denen die meisten dokumentiert werden, darunter träge, beschuldig und Zeitstempel. Verhalten sind eine einfache Möglichkeit, allgemeinen Code in vielen Ihrer Datenmodelle wiederzuverwenden, ohne den Code an vielen Stellen wiederholen zu müssen. Das Einfügen eines Verhaltens in ein Modell kann oft mit nur zwei Codezeilen erfolgen. Mit zunehmender Anzahl von Modellen in Ihrer Anwendung werden Verhaltensweisen immer nützlicher.

Was ist das Zeitstempelverhalten??

Das Timestamp-Verhalten macht es uns leicht, die häufig benötigte Aufgabe zu implementieren, das aktuelle Datum und die aktuelle Uhrzeit Einfügungen und Aktualisierungen in einem ActiveRecord-Modell zuzuordnen, wobei die Eigenschaften für automatisch festgelegt werden hergestellt in und aktualisiert am.

Früher in dieser Serie haben wir das Zeitstempelverhalten manuell implementiert. Immer wenn Statusmodelle vom Benutzer gesendet wurden, der ein Formular übermittelte, haben wir beiden Feldern den aktuellen Unix-Zeitstempel zugewiesen:

 öffentliche Funktion actionCreate () $ model = new Status (); if ($ model-> load (Yii :: $ app-> request-> post ())) $ model-> created_at = time (); $ model-> updated_at = time (); if ($ model-> save ()) return $ this-> redirect (['view', 'id' => $ model-> id]);  else var_dump ($ model-> getErrors ()); sterben();  

Durch die Implementierung des Timestamp-Verhaltens wird dies automatisch für uns erledigt und kann problemlos zu allen ActiveRecord-Modellen in einer Webanwendung hinzugefügt werden.

Implementieren des Zeitstempelverhaltens im Statusmodell

Fast jedes Modell, das ich in Yii schaffe, hat eine hergestellt in und aktualisiert am Feld. Es ist eine gute Praxis. Daher ist das Timestamp-Verhalten in fast jedem Modell hilfreich.

Hinzufügen des Zeitstempelverhaltens zum Statusmodell

Im models / Status.php wir fügen das hinzu Zeitstempelverhalten nach dem Träge und Schuld:

 public function behaviors () return [['class' => SluggableBehavior :: className (), 'attribut' => 'message', 'immutable' => true, 'sureUnique' => true,], ['class' => BlameableBehavior :: className (), 'createdByAttribute' => 'created_by', 'updatedByAttribute' => 'updated_by',], 'timestamp' => ['class' => 'yii \ behaviours \ TimestampBehavior', ' '=> [ActiveRecord :: EVENT_BEFORE_INSERT => [' Created_at ',' Updated_at '], ActiveRecord :: EVENT_BEFORE_UPDATE => [' Updated_at '],],];]; 

Wir müssen auch die ActiveRecord-Klasse an die Spitze unseres Modells aufnehmen (ich habe diesen Teil immer vergessen):

Dann entfernen wir die erforderliche Regel für hergestellt in und aktualisiert am in den Modellregeln:

 public function rules () return [[['message', 'created_at', 'updated_at'], 'required'], [['message'], 'Zeichenfolge'], [['' permissions '', 'created_at', 'updated_at', 'created_by'], 'Ganzzahl']];  

So was:

 public function rules () return [[['message'], 'required'], [['' message '],' string '], [[' 'permissions' ',' created_at ',' updated_at ',' created_by ']) , 'Ganzzahl']];  

Dadurch kann die Validierung erfolgreich sein und mit den Verhaltensweisen fortfahren.

Wir müssen auch die StatusController entfernen hergestellt in und aktualisiert am Zuweisungen in der Erstellungsaktion:

 öffentliche Funktion actionCreate () $ model = new Status (); if ($ model-> load (Yii :: $ app-> request-> post ())) if ($ model-> save ()) return $ this-> redirect (['view', 'id') => $ model-> id]);  else var_dump ($ model-> getErrors ()); sterben();  return $ this-> render ('create', ['model' => $ model,]);  

Sobald alle diese Änderungen abgeschlossen sind, können wir einen neuen Statusbeitrag schreiben:

Und die resultierende Ansicht zeigt die hergestellt in und aktualisiert am Einstellungen, die durch das Timestamp-Verhalten vorgenommen wurden.

Die Touch-Methode

Das Timestamp-Verhalten enthält auch eine Methode mit dem Namen berühren() Auf diese Weise können Sie den angegebenen Attributen den aktuellen Zeitstempel zuweisen und in der Datenbank speichern.

$ model-> touch ('updated_at');

Wenn Sie beispielsweise einen Hintergrund-Cron-Job haben, der in der Statustabelle etwas verarbeitet, haben Sie möglicherweise eine last_processed_at Zeitstempel, an den Sie das Verhalten anhängen. Wenn der Cron-Job ausgeführt wird, würden Sie dieses Feld berühren:

$ model-> touch ('last_processed_at');

Der Timestamp-Verhaltens-Quellcode

Da Yii2 jetzt die PSR-4-Namenskonventionen unterstützt, ist es einfacher, direkt in den Code des Frameworks einzutauchen, um zu sehen, wie es funktioniert. Werfen wir einen Blick auf die Zeitstempelverhalten Code, um zu verstehen, wie es implementiert wird.

Der Code ist auf der Dokumentationsseite mit GitHub verknüpft:

class TimestampBehavior erweitert AttributeBehavior / ** * @var string um das Attribut, das den Zeitstempelwert erhält. * Setzen Sie diese Eigenschaft auf false, wenn Sie die Erstellungszeit nicht aufzeichnen möchten. * / public $ createdAtAttribute = 'created_at'; / ** * @var Zeichenfolge Das Attribut, das den Zeitstempelwert erhält. * Setzen Sie diese Eigenschaft auf "false", wenn Sie die Aktualisierungszeit nicht aufzeichnen möchten. * / public $ updatedAtAttribute = 'updated_at'; / ** * @var callable | Expression Der Ausdruck, der zum Generieren des Zeitstempels verwendet wird. * Dies kann entweder eine anonyme Funktion sein, die den Zeitstempelwert zurückgibt, * oder ein [[Ausdruck]] - Objekt, das einen DB-Ausdruck darstellt (z. B. 'neuer Ausdruck (' NOW () ')'). * Wenn nicht festgelegt, wird der Wert von 'time ()' verwendet, um die Attribute festzulegen. * / public $ value; / ** * @inheritdoc * / public function init () parent :: init (); if (leer ($ this-> attributes)) $ this-> attributes = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> updatedAtAttribute ,];  / ** * @inheritdoc * / protected function getValue ($ event) if (Ausdruck $ this-> value-Instanz) return $ this-> value;  else return $ this-> value! == null? call_user_func ($ this-> value, $ event): time ();  / ** * Aktualisiert ein Zeitstempelattribut mit dem aktuellen Zeitstempel. * * "php * $ model-> touch ('lastVisit'); *" * @param string $ Attribut den Namen des zu aktualisierenden Attributs. * / public function touch ($ attribute) $ this-> owner-> updateAttributes (array_fill_keys ((array) $ attribut, $ this-> getValue (null))); 

Die Standardattribute werden hier definiert und können in unseren Modellen angepasst werden:

 public $ createdAtAttribute = 'created_at'; public $ updatedAtAttribute = 'updated_at';

Bei der Initialisierung definiert das Verhalten, welche Ereignisse Zeitstempelaktualisierungen für die angegebenen Attribute auslösen:

öffentliche Funktion init () parent :: init (); if (leer ($ this-> attributes)) $ this-> attributes = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> updatedAtAttribute ,]; 

Weitere Informationen zu Yii2 ActiveRecord-Ereignissen finden Sie hier.

Das Wert erhalten Die Methode gibt den aktuellen Zeitstempel für das Attribut zurück, wenn es nicht definiert ist:

geschützte Funktion getValue ($ event) if ($ this-> value Instanz von Expression) return $ this-> value;  else return $ this-> value! == null? call_user_func ($ this-> value, $ event): time ();  

Standardmäßig, Zeitstempelverhalten wird die füllen hergestellt in und aktualisiert am Attribute mit dem aktuellen Zeitstempel, wenn das zugehörige Objekt eingefügt wird. Es wird die füllen aktualisiert am Attribut mit dem Zeitstempel, wenn das Objekt aktualisiert wird. Wenn keine benutzerdefinierte Funktion zugewiesen ist, wird PHP verwendet Zeit() Funktion, die den aktuellen Unix-Zeitstempel zurückgibt.

Es implementiert auch die berühren Methode für die definierten Attribute:

/ ** * Aktualisiert ein Zeitstempelattribut mit dem aktuellen Zeitstempel. * * "php * $ model-> touch ('lastVisit'); *" * @param string $ Attribut den Namen des zu aktualisierenden Attributs. * / public function touch ($ attribute) $ this-> owner-> updateAttributes (array_fill_keys ((array) $ attribut, $ this-> getValue (null))); 

Hoffentlich erhalten Sie so eine Vorstellung davon, wie Sie Ihr eigenes Modellverhalten implementieren können. Wenn Sie etwas Neues erstellen, veröffentlichen Sie in den Kommentaren einen Link zum Code, damit andere ihn überprüfen können.

Was kommt als nächstes?

Ich hoffe, es hat Ihnen Spaß gemacht, etwas über das Verhalten von Yii2 Timestamp zu erfahren und den Quellcode von Yii2 zu erkunden.

Achten Sie auf kommende Tutorials in meiner Programmierreihe "Programmieren mit Yii2", während ich mich weiter mit verschiedenen Aspekten des Frameworks beschäftige. Vielleicht möchten Sie auch die Serie "Erstellen Sie Ihr Startup mit PHP" ausprobieren, die die erweiterte Vorlage von Yii2 verwendet, während ich eine Anwendung aus der realen Welt baue.

Ich freue mich über Feature- und Themenanfragen. Sie können sie in den Kommentaren unten posten oder mich auf meiner Lookahead Consulting-Website per E-Mail benachrichtigen.

Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial ankommt, folgen Sie mir @reifman auf Twitter oder besuchen Sie meine Instructor-Seite. Meine Ausbilderseite enthält alle Artikel dieser Serie, sobald sie veröffentlicht sind. 

ähnliche Links

  • Der endgültige Leitfaden für Yii2: Verhalten
  • Yii2-Dokumentation: Zeitstempelverhalten
  • Yii2 Developer Exchange, meine Website für Yii2-Ressourcen