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.
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.
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.
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.
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
undaktualisiert 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
undaktualisiert 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
undaktualisiert 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üllenhergestellt in
undaktualisiert am
Attribute mit dem aktuellen Zeitstempel, wenn das zugehörige Objekt eingefügt wird. Es wird die füllenaktualisiert am
Attribut mit dem Zeitstempel, wenn das Objekt aktualisiert wird. Wenn keine benutzerdefinierte Funktion zugewiesen ist, wird PHP verwendetZeit()
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