Se stai chiedendo "Cos'è Yii?" guarda il mio tutorial precedente: Introduzione al framework Yii, che rivede i vantaggi di Yii e include una panoramica delle novità in Yii 2.0, rilasciata nell'ottobre 2014.
In questa serie di programmazione con Yii2, guido i lettori all'uso del nuovo Yii2 Framework per PHP. In questo tutorial, esploreremo i comportamenti di Timestamp, che riducono la quantità di codice che è necessario scrivere con ciascun nuovo modello per l'operazione comune di creazione di timestamp per inserti e aggiornamenti. Ci tufferemo anche nel codice sorgente Yii2, esaminando come viene implementato un comportamento.
Per gli esempi di questo tutorial, continueremo a immaginare che stiamo costruendo un framework per la pubblicazione di semplici aggiornamenti di stato, ad es. il nostro mini-Twitter.
Solo un promemoria, parteciperò alle discussioni dei commenti qui sotto. Sono particolarmente interessato se hai approcci diversi, idee aggiuntive o vuoi suggerire argomenti per futuri tutorial.
I comportamenti di Yii2 sono essenzialmente mixin. Wikipedia descrive i mixins come "una classe che contiene una combinazione di metodi di altre classi, e come tale combinazione dipenda dal linguaggio, ma non dall'ereditarietà".
Yii li descrive in questo modo:
Il collegamento di un comportamento a un componente "inietta" i metodi e le proprietà del comportamento nel componente, rendendo accessibili tali metodi e proprietà come se fossero definiti nella classe del componente stessa.
Yii2 offre diversi comportamenti incorporati, la maggior parte dei quali verranno documentati, compresi gli sluggable, biasimevoli e timestamp. I comportamenti sono un modo semplice per riutilizzare il codice comune su molti modelli di dati senza dover ripetere il codice in molti punti. L'iniezione di un comportamento in un modello può spesso essere eseguita con due sole righe di codice. Man mano che aumenta il numero di modelli nella tua applicazione, i comportamenti diventano sempre più utili.
Il Comportamento Timestamp rende facile per noi implementare il compito frequentemente necessario di assegnare la data e l'ora corrente agli inserti e agli aggiornamenti in un modello ActiveRecord, impostando automaticamente le proprietà per created_at
e updated_at
.
In precedenza in questa serie, abbiamo implementato manualmente il comportamento del timestamp. Ogni volta che i modelli di stato sono stati pubblicati dall'utente che ha inviato un modulo, abbiamo assegnato il timestamp Unix corrente a entrambi i campi:
funzione pubblica 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 ()); morire();
L'implementazione del comportamento del Timestamp lo farà automaticamente per noi e può essere facilmente aggiunto a tutti i modelli ActiveRecord in un'applicazione web.
Quasi tutti i modelli che creo in Yii hanno un created_at
e updated_at
campo. È una buona pratica. Pertanto, il comportamento del Timestamp è utile in quasi tutti i modelli.
Nel modelli / Status.php
aggiungiamo il TimestampBehavior
dopo Sluggable
e biasimevole
:
public function behaviors () return [['class' => SluggableBehavior :: className (), 'attribute' => 'message', 'immutable' => true, 'ensureUnique' => true,], ['class' => BlameableBehavior :: className (), 'createdByAttribute' => 'created_by', 'updatedByAttribute' => 'updated_by',], 'timestamp' => ['class' => 'yii \ behaviors \ TimestampBehavior', 'attributi '=> [ActiveRecord :: EVENT_BEFORE_INSERT => [' created_at ',' updated_at '], ActiveRecord :: EVENT_BEFORE_UPDATE => [' updated_at '],],],];
Dobbiamo anche includere la classe ActiveRecord nella parte superiore del nostro modello (ho sempre dimenticato questa parte):
Quindi, rimuoviamo la regola richiesta per
created_at
eupdated_at
nelle regole del modello:public function rules () return [[['message', 'created_at', 'updated_at'], 'required'], [['message'], 'string'], [['permessi', 'created_at', 'updated_at', 'created_by'], 'intero']];Come questo:
public function rules () return [['message'], 'required'], [['message'], 'string'], [['permessi', 'created_at', 'updated_at', 'created_by'] , 'numero intero'] ];Ciò consente alla convalida di avere successo e di continuare i comportamenti.
Abbiamo anche bisogno di rimuovere StatusController
created_at
eupdated_at
assegnazioni nell'azione di creazione:funzione pubblica 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 ()); morire(); restituisce $ this-> render ('create', ['model' => $ model,]);Una volta completate tutte queste modifiche, possiamo scrivere un nuovo post di stato:
E la vista risultante mostra il
created_at
eupdated_at
impostazioni effettuate dal comportamento del Timestamp.Il metodo Touch
Il comportamento Timestamp fornisce anche un metodo chiamato
toccare()
che consente di assegnare la data / ora corrente all'attributo / i specificato / i e salvarli nel database.$ Modello-> touch ( 'updated_at');Ad esempio, se si dispone di un processo cron di background che esegue qualche elaborazione sulla tabella di stato, si potrebbe avere un
last_processed_at
timestamp a cui si allega il comportamento. Ogni volta che viene eseguito il processo cron, toccherà quel campo:$ Modello-> touch ( 'last_processed_at');Il codice sorgente del comportamento del timestamp
Poiché Yii2 ora supporta le convenzioni di denominazione PSR-4, è più facile immergersi direttamente nel codice framework per vedere come funziona. Diamo un'occhiata al
TimestampBehavior
codice per capire come è implementato.Il codice è collegato a GitHub dalla pagina di documentazione:
class TimestampBehavior estende AttributeBehavior / ** * @var stringa l'attributo che riceverà il valore di timestamp * Imposta questa proprietà su false se non vuoi registrare il tempo di creazione. * / public $ createdAtAttribute = 'created_at'; / ** * @var stringa l'attributo che riceverà il valore di data / ora. * Impostare questa proprietà su false se non si desidera registrare il tempo di aggiornamento. * / public $ updatedAtAttribute = 'updated_at'; / ** * @var callable | Expression L'espressione che verrà utilizzata per generare il timestamp. * Può trattarsi di una funzione anonima che restituisce il valore di timestamp, * o un oggetto [[Expression]] che rappresenta un'espressione DB (ad esempio 'new Expression (' NOW () ')'). * Se non impostato, utilizzerà il valore di 'time ()' per impostare gli attributi. * / valore $ pubblico; / ** * @inheritdoc * / public function init () parent :: init (); if (vuoto ($ this-> attributi)) $ this-> attributes = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> updatedAtAttribute ,]; / ** * @inheritdoc * / funzione protetta getValue ($ event) if ($ this-> valore instanceof Expression) return $ this-> value; else return $ this-> value! == null? call_user_func ($ this-> value, $ event): time (); / ** * Aggiorna un attributo timestamp al timestamp corrente. * * "php * $ model-> touch ('lastVisit'); *" * @param stringa $ attribuisce il nome dell'attributo da aggiornare. * / funzione pubblica touch ($ attribute) $ this-> owner-> updateAttributes (array_fill_keys ((array) $ attributo, $ this-> getValue (null)));Gli attributi predefiniti sono definiti qui e possono essere personalizzati nei nostri modelli:
public $ createdAtAttribute = 'created_at'; public $ updatedAtAttribute = 'updated_at';All'inizializzazione, il comportamento definisce quali eventi attivano gli aggiornamenti di data / ora agli attributi specificati:
funzione pubblica init () parent :: init (); if (vuoto ($ this-> attributi)) $ this-> attributes = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> updatedAtAttribute ,];Puoi leggere ulteriori informazioni su Yii2 ActiveRecord Events qui.
Il
getValue
metodo restituisce il timestamp corrente per l'attributo se è indefinito:funzione protetta getValue ($ event) if ($ this-> valore instanceof Expression) return $ this-> value; else return $ this-> value! == null? call_user_func ($ this-> value, $ event): time ();Di default,
TimestampBehavior
riempirà ilcreated_at
eupdated_at
attributi con il timestamp corrente quando viene inserito l'oggetto associato. Riempirà ilupdated_at
attributo con il timestamp quando l'oggetto viene aggiornato. Se non è assegnata alcuna funzione personalizzata, utilizza il PHPtempo()
funzione, che restituisce il timestamp attuale di Unix.Implementa anche il
toccare
metodo per gli attributi definiti:/ ** * Aggiorna un attributo timestamp al timestamp corrente. * * "php * $ model-> touch ('lastVisit'); *" * @param stringa $ attribuisce il nome dell'attributo da aggiornare. * / funzione pubblica touch ($ attribute) $ this-> owner-> updateAttributes (array_fill_keys ((array) $ attributo, $ this-> getValue (null)));Si spera che questo ti dia un'idea di come implementare il tuo comportamento del modello. Se crei qualcosa di nuovo, inserisci un link al codice nei commenti in modo che altri possano verificarlo.
Qual'è il prossimo?
Spero ti sia piaciuto conoscere i comportamenti di Yii2 Timestamp ed esplorare il codice sorgente Yii2.
Guarda le prossime esercitazioni nella mia serie Programming with Yii2 mentre continuo a immergermi nei diversi aspetti del framework. Potresti anche voler controllare la mia creazione della tua startup con la serie PHP, che usa il template avanzato di Yii2 mentre costruisco un'applicazione del mondo reale.
Accolgo richieste di argomenti e argomenti. Puoi postarli nei commenti qui sotto o mandarmi una e-mail sul mio sito Web di Lookahead Consulting.
Se vuoi sapere quando arriverà il prossimo tutorial di Yii2, seguimi @reifman su Twitter o controlla la mia pagina di istruttore. La mia pagina di istruttore includerà tutti gli articoli di questa serie non appena saranno pubblicati.
Link correlati