Astrazione del database

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
27
Roma
alessandro1997.netsons.org
Pubblico di seguito una classe a cui sto lavorando da qualche giorno. Essa consente di rendere l'interazione con un database compatibile con PDO molto più simile alla realtà: ogni record è un oggetto le cui proprietà sono le colonne del record. Esse si possono modificare semplicemente modificando il valore della proprietà corrispondente e poi eseguendo il metodo commit(). È anche possibile accedere alle colonne come in un array.

Le funzioni in realtà sono molte di più: è possibile anche estendere la classe di base Database_Record per impostare dei metodi che verranno usati al posto dei getter e dei setter di default (e quindi eseguiti durante ogni tipo di accesso alle colonne: con i metodi __get, __set, __isset e __unset ma anche come array).
Questo è molto utile se come me sviluppate applicazioni fortemente orientate agli oggetti. Supponiamo ad esempio di avere una tabella users con all'interno varie colonne tra cui group, in relazione con la tabella groups. Non potete salvare un oggetto nel database (in realtà si può, ma è piuttosto sconveniente). Basterà così creare la classe User e strutturarla in questo modo:
PHP:
<?php
class User extends Database_Record
{
    protected function setGroup($new_group)
    {
        return $new_group->id;
    }

    protected function getGroup($group_id)
    {
        try {
            return new Group('id', $group_id);
        }
        catch (DatabaseException $e) {
            return false;
        }
    }
}
?>
La mia classe applicherà automaticamente i metodi setGroup e getGroup quando si tenterà di impostare o recuperare il valore della proprietà, convertendo il valore in numero o in oggetto on-the-fly.

La classe è ampiamente documentata e sono presenti due esempi, quindi non mi dilungo ulteriormente. Fatene buon uso e fatemi sapere cosa ne pensate. :)
 

Allegati

Ad esempio sarà possibile definire degli helper personalizzati. Questo è molto utile quando si usano delle tabelle con un prefisso che può variare per ogni installazione (ad esempio in un CMS distribuito al pubblico) e quindi non si possono sapere in anticipo i nomi delle tabelle.
Si potrà quindi fare una cosa del genere:
PHP:
$db = Database::getInstance();
$db->setCustomHelper('pref_users', 'User');
E al recupero di un record dalla classe pref_users invece di cercare di creare un oggetto Pref_user (come farebbe normalmente) la classe creerà invece un oggetto User.
 

Discussioni simili