Skip to content

Despre Idiorm, Paris și obiecte model

StelarCF edited this page Apr 20, 2014 · 2 revisions

Un program bine făcut trebuie să fie cât mai puțin legat de o anumită bază de date. Ne-ar fi ușor să scriem interogările direct în MySQL:

mysql_query('SELECT * from problem WHERE id = 10 AND status = 0');

Dar atunci ne-ar fi imposibil să migrăm vreodată la PostgreSQL sau altceva. Chiar și să redenumim un tabel ar fi o corvoadă. De aceea, folosim un ORM (object-relational mapper), adică un program care oferă o sintaxă proprie. Este treaba acelui program să convertească sintaxa proprie în sintaxă MySQL. Am ales Idiorm, care nu este foarte puternic, dar este simplu și rapid. Peste Idiorm vine Paris, care este o implementare de Active record. Aceasta înseamnă că putem folosi înregistrările din baza de date ca pe niște obiecte. Apelăm $user->save(); și este treaba lui Paris să traducă asta într-un update în MySQL.

Interogarea de mai sus se rescrie în Paris ca:

$p = Model::Factory('Problem')->where('id', 10)->where('status', 0)->find_one();

Pentru detalii, vedeți paginile de manual Idiorm și Paris, în special secțiunile „Querying”. Noi folosim Paris, dar pagina de Idiorm dă mai multe exemple.

În situații rare, permitem accesul la metodele raw_query() sau where_raw(), acolo unde variantele „elegante”, care folosesc exclusiv metode din Paris, ar fi prea lente. Dar nu abuzăm de asta.

Particularizări în codul varena

Pentru simplitatea codului, am făcut câteva modificări în baza noastră de cod.

  1. Clasele pentru obiectele-model stau în lib/model.
  2. Ele nu trebuie invocate automat. Clasa lib/Util.php introduce o rutină de autoload care, la prima apelare a unei clase în cod, o caută și o include din lib/ sau din lib/model.
  3. Ele nu extind direct clasa Model (furnizată de Idiorm), ci extind clasa BaseObject, care la rândul ei extinde clasa Model. Facem aceasta pentru că în strămoșul comun BaseObject inserăm niște cod util (vezi mai jos).

Clasa BaseObject

Această clasă simplifică sintaxa interogărilor care selectează sau șterg obiecte după anumite câmpuri. Astfel, interogarea:

$p = Model::Factory('Problem')->where('id', 10)->where('status', 0)->find_one();

devine

$p = Problem::get_by_id_status(10, 0);

Dacă vă întrebați de ce nu găsiți aceste metode definite nicăieri în cod, ele sunt parsate în metoda __callStatic(). Nu este un mecanism foarte elegant, dar am considerat că beneficiile (simplitatea sintaxei) justifică acest artificiu.

De asemenea, BaseObject salvează automat valorile câmpurilor created (la crearea unui obiect) și modified (la fiecare salvare ulterioară a obiectului). Nu este nevoie să modificați manual aceste câmpuri. Nu știm dacă vom avea nevoie de ele, dar ele oferă un minim de istoric al datelor cu zero cost.

Clone this wiki locally