Cum se programează cu Yii2 Comportamentul timestamp

Ce veți crea

Dacă vă întrebați: "Ce este Yii?" verificați tutorialul meu anterior: Introducere în Cadrul Yii, care analizează beneficiile Yii și include o prezentare generală a ceea ce este nou în Yii 2.0, lansat în octombrie 2014.

În această serie de programare cu seria Yii2, îndrumăm cititorii în folosirea noii tehnologii Yii2 Framework for PHP. În acest tutorial, vom explora Comportamente Timestamp, care reduc cantitatea de cod de care aveți nevoie pentru a scrie cu fiecare nou model pentru operațiunea comună de a crea timestamps pentru inserturi și actualizări. Ne vom scufunda, de asemenea, în codul sursă Yii2, examinând modul în care este implementat un comportament.

Pentru exemplele din acest tutorial, vom continua să ne imaginăm că construim un cadru pentru afișarea actualizărilor de stare simple, de ex. propriul mini-Twitter.

Doar un memento, eu particip la comentariile de mai jos. Sunt interesat în special dacă aveți abordări diferite, idei suplimentare sau doriți să sugerați subiecte pentru tutoriale viitoare.

Ce este o comportament?

Comportamentele Yii2 sunt, în esență, amestecuri. Wikipedia descrie mixurile ca fiind "o clasă care conține o combinație de metode din alte clase. Cum se face o astfel de combinație depinde de limbă, dar nu de moștenire".

Yii le descrie astfel:

Atașarea unui comportament la o componentă "injectă" metodele și proprietățile comportamentului în componentă, făcând acele metode și proprietăți accesibile ca și când ar fi fost definite în clasa componentelor.

Yii2 oferă mai multe comportamente încorporate, cele mai multe dintre acestea vom fi documentate, incluzând semne de avertizare, vina și amprentă de timp. Comportamentele sunt o modalitate ușoară de a reutiliza codul comun pe multe dintre modelele dvs. de date fără a trebui să repetați codul în multe locuri. Injectarea unui comportament într-un model poate fi făcută adesea doar cu două linii de cod. Pe măsură ce numărul de modele din aplicația dvs. crește, comportamentele devin din ce în ce mai utile.

Care este comportamentul Timestamp?

Comportamentul timestamp-ului ne ușurează implementarea sarcinii frecvent necesare de atribuire a datei și orei curente inserțiilor și actualizărilor într-un model ActiveRecord, setarea automată a proprietăților pentru creat la și updated_at.

La începutul acestei serii, am implementat manual comportamentul timestamp. Ori de câte ori au fost postate modelele de stare de către utilizatorul care a trimis un formular, am alocat timestampului curent Unix ambelor câmpuri:

 funcția publică funcțiaCreate () $ model = new Status (); dacă ($ model-> încărcați (Yii :: $ app-> request-> post ())) $ model-> created_at = time (); $ model-> updated_at = timp (); dacă ($ model-> save ()) retur $ this-> redirect (['view', 'id' => $ model-> id]);  altfel var_dump ($ model-> getErrors ()); a muri();  

Implementarea comportamentului timestamp va face acest lucru automat pentru noi și poate fi ușor adăugat la toate modelele ActiveRecord dintr-o aplicație web.

Implementarea Comportamentului Timpului în Modelul de Stat

Aproape orice model pe care-l creez în Yii are a creat la și updated_at camp. Este o practică bună. Astfel, comportamentul Timestamp este util în aproape fiecare model.

Adăugarea comportamentului timestamp la modelul de stare

În modele / Status.php adăugăm TimestampBehavior după Sluggable și Blameable:

 funcția publică "() return '[' class '=> SluggableBehavior :: className (),' attribute '=>' message ',' immutable '=> true, => 'BlameableBehavior :: className (),' createdByAttribute '=>' created_by ',' updatedByAttribute '=>' update_by ',],' timestamp '=> '=> [ActiveRecord :: EVENT_BEFORE_INSERT => [' created_at ',' updated_at '], ActiveRecord :: EVENT_BEFORE_UPDATE => [' updated_at '],],],]; 

De asemenea, trebuie să includem clasa ActiveRecord în partea de sus a modelului nostru (întotdeauna uit această parte):

Apoi, eliminăm regula necesară creat la și updated_at în regulile modelului:

 regulile funcției publice () return [['message', 'created_at', 'updated_at'], 'required'], [['message', 'string'], 'updated_at', 'created_by'], 'integer']];  

Asa:

 reguli de funcționare publică () return [['message'], 'required'], [['message'], 'string'], [['permissions', 'created_at', 'updated_at', 'created_by'] , "întreg"]];  

Acest lucru permite validarea pentru a reuși și continuarea comportamentelor.

Trebuie, de asemenea, să eliminăm StatusController-ul creat la și updated_at cesiuni în acțiunea de creare:

 funcția publică funcțiaCreate () $ model = new Status (); dacă $ model-> încărcați (Yii :: $ app-> request-> post ())) if ($ model-> save ()) return $ this-> redirect => $ model-> id]);  altfel var_dump ($ model-> getErrors ()); a muri();  returnați $ this-> render ('create', ['model' => model $,]);  

Odată ce toate aceste modificări sunt complete, putem scrie un nou post de stare:

Și, vizualizarea rezultată arată creat la și updated_at setările efectuate de comportamentul Timestamp.

Metoda atingerii

De asemenea, comportamentul Timestamp oferă o metodă numită atingere() care vă permite să atribuiți marcajul de timp curent atributului specificat și să-l salvați în baza de date.

$ Model-> tactil ( 'updated_at');

De exemplu, dacă aveți o lucrare cron de fundal care face o prelucrare pe tabela de stare, este posibil să aveți a last_processed_at marcajul temporal la care atașați comportamentul. Ori de câte ori lucrarea cron rulează, veți atinge acel câmp:

$ Model-> tactil ( 'last_processed_at');

Codul sursă pentru comportamentul timestamp

Din moment ce Yii2 acceptă acum convențiile de numire PSR-4, este mai ușor să se scufundă chiar în codul cadru pentru a vedea cum funcționează. Să aruncăm o privire la TimestampBehavior pentru a înțelege modul în care este implementat.

Codul este conectat la GitHub din pagina de documentare:

clasa TimestampBehavior extinde AttributeBehavior / ** * @var string atributul care va primi valoarea timestamp * Setați această proprietate la false dacă nu doriți să înregistrați timpul de creare. * / public $ createAtAttribute = 'created_at'; / ** * @var șirul atribut care va primi valoarea timestamp. * Setați această proprietate la falsă dacă nu doriți să înregistrați timpul de actualizare. * / public $ actualizatAtAttribute = 'updated_at'; / ** * @var callable | Expresie Expresia care va fi folosită pentru generarea timestampului. * Aceasta poate fi o funcție anonimă care returnează valoarea timestamp, * sau un obiect [[Expression]] reprezentând o expresie DB (de exemplu, 'New Expression' ('NOW') '). * Dacă nu este setat, va folosi valoarea 'time ()' pentru a seta atributele. * / valoare publică; / ** * @inheritdoc * / funcția publică init () parent :: init (); dacă empty ($ this-> attributes)) $ this-> attributes = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> ,];  / ** * @inheritdoc * / funcția protejată getValue ($ event) if ($ this-> value instanceof Expression) return $ this-> value;  altceva return $ this-> value! == null? call_user_func ($ this-> value, $ event): time ();  / ** * Actualizează atributul timestamp la amprentă curentă. * * "php * $ model-> atingeți ('lastVisit'); *" * @param string $ atribuie numele atributului de actualizat. * / atinge funcția publică (atributul $) $ this-> owner-> updateAttributes (array_fill_keys ((array) $ atribut, $ this-> getValue (null)); 

Atributele implicite sunt definite aici și pot fi personalizate în modelele noastre:

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

La inițializare, comportamentul definește ce evenimente declanșează actualizarea timestului la atributele specificate:

funcția publică init () parent :: init (); dacă empty ($ this-> attributes)) $ this-> attributes = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> ,]; 

Puteți citi mai multe despre evenimentele Yii2 ActiveRecord aici.

getValue metoda returnează marcajul curent pentru atributul dacă acesta este nedefinit:

funcția protejată getValue ($ event) if ($ this-> value instanceof Expression) retur $ this-> value;  altceva return $ this-> value! == null? call_user_func ($ this-> value, $ event): time ();  

În mod implicit, TimestampBehavior va umple creat la și updated_at atributează cu marcajul de timp curent când se introduce obiectul asociat. Se va umple updated_at atribuiți cu marcajul de timp atunci când obiectul este actualizat. Dacă nu este atribuită nicio funcție personalizată, atunci se folosește PHP timp() funcție, care returnează timestampul curent Unix.

De asemenea, implementează atingere pentru atributele definite:

/ ** * Actualizează un atribut de timbru a amprentei curente. * * "php * $ model-> atingeți ('lastVisit'); *" * @param string $ atribuie numele atributului de actualizat. * / atinge funcția publică (atributul $) $ this-> owner-> updateAttributes (array_fill_keys ((array) $ atribut, $ this-> getValue (null)); 

Sperăm că acest lucru vă oferă o idee despre modul în care puteți implementa propriul comportament de model. Dacă creați ceva nou, postați un link spre cod în comentarii, astfel încât alții să îl poată verifica.

Ce urmeaza?

Sper că v-ați bucurat să învățați comportamentele Yii2 Timestamp și să explorați codul sursă Yii2.

Urmăriți tutorialele viitoare din programul meu de programare cu seria Yii2, deoarece continuam să scufundăm în diferite aspecte ale cadrului. Puteți, de asemenea, doriți să verificați starea mea Building Your Startup With PHP, care utilizează șablonul avansat al lui Yii2, pe măsură ce construiesc o aplicație din lumea reală.

Salut cererile de teme și teme. Puteți să le postați în comentariile de mai jos sau puteți să ne trimiteți un e-mail pe site-ul meu Lookahead Consulting.

Dacă doriți să știți când vine următorul tutorial Yii2, urmați-mă @reifman pe Twitter sau verificați pagina de instructor. Pagina mea de instructor va include toate articolele din această serie de îndată ce vor fi publicate. 

Link-uri conexe

  • Ghidul definitiv Yii2: comportamente
  • Documentația Yii2: comportamentul timestamp
  • Yii2 Developer Exchange, site-ul meu de resurse Yii2
Cod