Laravel 4 Model Events: Popularea dinamica a coloanelor la insert/update

Cand trebuie sa creez o zona de administrare, de cele mai multe ori doresc sa stiu nu doar cand un utilizator a creat sau editat un item (o postare), ci si cine este acel utilizator.

Luand in considerare aceasta nevoie, de fiecare data adaug doua coloane aditionale la tabelele din baza de date: created_by si updated_by. Acestea, impreuna cu timestamp-urile Laravel, sunt cea mai buna metoda de a urmari cele mai recente schimbari realizate unei inregistrari din baza de date.

In trecut, cand voiam sa creez/updated o postare scriam ceva de genul:

$post = new Post; // apelam modelul Post...
$post->title = $title; // $title este preluat dintr-un formular eventual...
// urmeaza popularea celorlalte campuri ale inregistrarii
$post->created_by = Auth::id(); // considerand ca folosim Laravel Authentication, vom prelua id-ul utilizatorului
$post->save();

Dupa cum poti vedea, cand am creat o postare, am adaugat linia $post->created_by = Auth::id();. La fel se va intampla si in cazul unui update: $post->updated_by = Auth::id();.

Toate bune si frumoase. Dar daca exista o cale mai usoara de a face acelasi lucru, la fel cum Laravel adauga timestamp-uri la fiecare insert sau update?

Si se pare ca exista o astfel de cale. Folosindu-ne de Model events al Laravel, poti foarte usor sa adaugi automat valori unei inregistrari la insert sau update:

“Eloquent models fire several events, allowing you to hook into various points in the model’s lifecycle using the following methods: creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored.”

OK. Deci, putem modifica modelul astfel incat la crearea sau updatarea unei inregistrari sa populam anumite coloane.

Considerand ca avem un model Post, putem insera o metoda boot unde sa inseram event-urile. Sa trecem la treaba:

<?php

class Post extends Eloquent {

  public static function boot()
  {
    parent::boot();
    // intai vom spune modelului ce sa faca la un event de creare a unei inregistrari
    static::creating(function($post)
    {
      $post->created_by = Auth::id();
    });
    // apoi spunem modelului ce sa faca la un event de updatare a unei inregistrari
    static::updating(function($post)
    {
      $post->updated_by = Auth::id();
    });
  }
}

Acum, cand creez/updatez o postare, modelul va introduce automat id-ul meu in tabel.

$post = new Post;
$post->title = $title;
// urmeaza popularea celorlalte campuri ale inregistrarii
// nu mai este necesar $post->created_by = Auth::id(); acest camp urmand a fi populat automat de catre model
$post->save();

Lasă un răspuns

Your email address will not be published. Required fields are marked *

No spam? * Time limit is exhausted. Please reload CAPTCHA.