Slik programmerer du med Yii2 Timestamp Behavior

Hva du skal skape

Hvis du spør, "Hva er Yii?" sjekk ut min tidligere opplæring: Introduksjon til Yii Framework, som vurderer fordelene med Yii og inneholder en oversikt over hva som er nytt i Yii 2.0, utgitt i oktober 2014.

I denne programmeringen med Yii2-serien, er jeg veiledende lesere i bruk av den nylig oppgraderte Yii2 Framework for PHP. I denne veiledningen vil vi undersøke Timestamp Behaviors, som reduserer mengden kode du må skrive med hver ny modell for den felles driften av å lage tidsstempler for innlegg og oppdateringer. Vi vil også dykke inn i kildekoden Yii2, og undersøke hvordan en oppførsel er implementert.

For eksemplene i denne opplæringen fortsetter vi å forestille oss at vi bygger et rammeverk for å legge ut enkle statusoppdateringer, f.eks. vår egen mini-Twitter.

Bare en påminnelse, jeg deltar i kommentar tråder nedenfor. Jeg er spesielt interessert hvis du har forskjellige tilnærminger, flere ideer, eller ønsker å foreslå emner for fremtidige opplæringsprogrammer.

Hva er en oppførsel?

Yii2 Behavior er i hovedsak mixins. Wikipedia beskriver mixiner som "en klasse som inneholder en kombinasjon av metoder fra andre klasser. Hvordan en slik kombinasjon gjøres avhenger av språket, men det er ikke av arv."

Yii beskriver dem på denne måten:

Ved å knytte en oppførsel til en komponent injiserer adferdens metoder og egenskaper inn i komponenten, noe som gjør disse metodene og egenskapene tilgjengelige som om de ble definert i komponentklassen selv.

Yii2 tilbyr flere innebygde oppføringer, hvorav de fleste dokumenterer, inkludert sluggable, skyldbar og tidsstempel. Atferd er en enkel måte å gjenbruke felles kode på mange av datamodellene uten å gjenta koden på mange steder. Injiserer en oppførsel i en modell kan ofte gjøres med bare to linjer med kode. Etter hvert som antall modeller i søknaden din øker, blir atferdene mer og mer nyttige.

Hva er Timestamp Oppførsel?

Timestamp Behavior gjør det enkelt for oss å implementere den ofte nødvendige oppgaven med å tilordne gjeldende dato og klokkeslett til innsatser og oppdateringer i en ActiveRecord-modell, automatisk innstilling av egenskapene for created_at og updated_at.

Tidligere i denne serien implementerte vi tidsstempeladferd manuelt. Når Statusmodeller ble lagt ut av brukeren som sendte inn et skjema, tilordnet vi dagens Unix tidsstempel til begge feltene:

 offentlig funksjon actionCreate () $ model = new Status (); hvis ($ model-> last (Yii :: $ app-> request-> post ())) $ model-> created_at = time (); $ model-> updated_at = time (); hvis ($ model-> save ()) return $ this-> omdirigere (['view', 'id' => $ model-> id]);  ellers var_dump ($ model-> getErrors ()); dø();  

Implementering av Timestamp-oppførselen gjør dette automatisk for oss, og kan enkelt legges til alle ActiveRecord-modellene i et webprogram.

Implementere timestampadferd i statusmodellen

Nesten hver modell jeg lager i Yii har a created_at og updated_at felt. Det er god praksis. Dermed er Timestamp-oppførselen nyttig i nesten alle modeller.

Legge til timestampadferd i statusmodellen

I modeller / Status.php vi legger til TimestampBehavior etter Sluggable og Blameable:

 Offentlig funksjon oppførsel () return [['class' => SluggableBehavior :: className (), 'attribute' => 'melding', 'immutable' => true, 'sikreUnique' => true,], => BlameableBehavior :: className (), 'createdByAttribute' => 'created_by', 'updatedByAttribute' => 'updated_by',], 'timestamp' => ['class' => 'yii \ oppførsel \ TimestampBehavior', 'attributes '=> [ActiveRecord :: EVENT_BEFORE_INSERT => [' created_at ',' updated_at '], ActiveRecord :: EVENT_BEFORE_UPDATE => [' updated_at '],],],]; 

Vi må også inkludere ActiveRecord-klassen på toppen av modellen vår (jeg glemmer alltid denne delen):

Da fjerner vi den nødvendige regelen for created_at og updated_at i modellreglene:

 offentlige funksjon regler () return [[['message', 'created_at', 'updated_at'], 'required'], [['message'], 'string'], [['permissions', 'created_at' 'updated_at', 'created_by'], 'integer']];  

Som dette:

 offentlige funksjon regler () return [[['message'], 'required'], [['message'], 'string'], [['permissions', 'created_at', 'updated_at', 'created_by'] , 'heltall']];  

Dette gjør at valideringen kan lykkes og fortsette til atferdene.

Vi må også fjerne StatusControllerens created_at og updated_at oppgaver i opprettingsaksjonen:

 offentlig funksjon actionCreate () $ model = new Status (); hvis ($ modell-> last (Yii :: $ app-> forespørsel-> post ())) hvis ($ modell-> lagre ()) return $ this-> omdirigere (['vis', 'id' => $ modell-> id]);  ellers var_dump ($ model-> getErrors ()); dø();  returnere $ this-> render ('create', ['model' => $ modell,]);  

Når alle disse endringene er ferdige, kan vi skrive et nytt statuspost:

Og den resulterende visningen viser created_at og updated_at innstillinger laget av timestamp-oppførselen.

Berøringsmetoden

Timestamp-oppførelsen gir også en metode som heter ta på() som lar deg tildele nåværende tidsstempel til det angitte attributtet (e) og lagre dem i databasen.

$ Modell> touch ( 'updated_at');

Hvis du for eksempel har en bakgrunnscronjobb som gjør noe behandling på statustabellen, kan det hende du har en last_processed_at tidsstempel som du vedlegger oppførselen til. Når cronjobben kjører, ville du røre ved dette feltet:

$ Modell> touch ( 'last_processed_at');

Timestamp Adfærd Kildekode

Siden Yii2 støtter nå PSR-4-navnekonvensjonene, er det lettere å dykke rett inn i rammekoden for å se hvordan det fungerer. La oss ta en titt på TimestampBehavior kode for å forstå hvordan den er implementert.

Koden er koblet til GitHub fra dokumentasjonssiden:

klasse TimestampBehavior utvider AttributeBehavior / ** * @var streng attributten som vil motta tidsstempelverdien * Angi denne egenskapen til falsk hvis du ikke vil registrere opprettelsestiden. * / public $ createdAtAttribute = 'created_at'; / ** * @var streng attributet som vil motta tidsstempelverdien. * Sett denne egenskapen til falsk hvis du ikke vil oppdatere oppdateringstiden. * / public $ updatedAtAttribute = 'updated_at'; / ** * @var callable | Ekspresjon Det uttrykket som vil bli brukt til å generere tidsstempel. * Dette kan enten være en anonym funksjon som returnerer tidsstempelverdien, * eller en [[Expression]] -objekt som representerer et DB-uttrykk (for eksempel 'New Expression (' NOW () ')'). * Hvis ikke satt, vil den bruke verdien av 'tid ()' for å angi attributter. * / offentlig $ verdi; / ** * @inheritdoc * / public function init () foreldre :: init (); hvis (tomt ($ dette-> attributter)) $ this-> attributes = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> updatedAtAttribute ,];  / ** * @inheritdoc * / beskyttet funksjon getValue ($ event) hvis ($ this-> value instanceof Expression) return $ this-> value;  ellers return $ this-> value! == null? call_user_func ($ this-> value, $ event): tid ();  / ** * Oppdaterer en tidsstempelattributt til gjeldende tidsstempel. * * "php * $ model-> touch ('lastVisit'); *" * @param string $ attributt navnet på attributtet for å oppdatere. * / public function touch ($ attributt) $ this-> owner-> updateAttributes (array_fill_keys ((array) $ attributt, $ this-> getValue (null))); 

Standardattributtene er definert her, og de kan tilpasses i våre modeller:

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

Ved initialisering definerer oppførselen hvilke hendelser som utløser tidsstempeloppdateringer til de angitte attributter:

offentlig funksjon init () foreldre :: init (); hvis (tomt ($ dette-> attributter)) $ this-> attributes = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> updatedAtAttribute ,]; 

Du kan lese mer om Yii2 ActiveRecord Events her.

De getValue metode returnerer gjeldende tidsstempel for attributtet hvis det er udefinert:

beskyttet funksjon getValue ($ event) if ($ this-> value instance of Expression) return $ this-> value;  ellers return $ this-> value! == null? call_user_func ($ this-> value, $ event): tid ();  

Som standard, TimestampBehavior vil fylle created_at og updated_at attributter med gjeldende tidsstempel når den tilknyttede objektet blir satt inn. Det vil fylle updated_at Tilordne med tidsstempel når objektet blir oppdatert. Hvis det ikke er tilordnet en tilpasset funksjon, bruker den PHP tid() funksjon, som returnerer gjeldende Unix tidsstempel.

Det implementerer også ta på metode for de definerte attributter:

/ ** * Oppdaterer en tidsstempelattributt til gjeldende tidsstempel. * * "php * $ model-> touch ('lastVisit'); *" * @param string $ attributt navnet på attributtet for å oppdatere. * / public function touch ($ attributt) $ this-> owner-> updateAttributes (array_fill_keys ((array) $ attributt, $ this-> getValue (null))); 

Forhåpentligvis gir dette deg en ide om hvordan du implementerer din egen modelladferd. Hvis du lager noe nytt, legg inn en lenke til koden i kommentarene, slik at andre kan sjekke det ut.

Hva blir det neste?

Jeg håper du har likt å lære om Yii2 Timestamp-oppførsel og utforske Yii2-kildekoden.

Se etter kommende opplæringsprogrammer i min programmering med Yii2-serien når jeg fortsetter å dykke inn i ulike aspekter av rammen. Du vil kanskje også sjekke ut Bygg opp din oppstart med PHP-serien, som bruker Yii2s avanserte mal, da jeg bygger en ekte verdensapplikasjon.

Jeg aksepterer funksjon og emneforespørsler. Du kan legge inn dem i kommentarene under eller sende meg en e-post på Lookahead Consulting.

Hvis du vil vite når neste Yii2 opplæring kommer, følg meg @ reifman på Twitter eller sjekk min instruktørside. Min instruktørside vil inkludere alle artiklene fra denne serien så snart de er publisert. 

Relaterte linker

  • Den Yii2 Definitive Guide: Behaviors
  • Yii2 Dokumentasjon: Timestamp Beteende
  • Yii2 Developer Exchange, min Yii2 ressurs side