Rompendo un grande oggetto PHP usato per astrarre il database. Migliori pratiche?

0

Due anni fa si pensava che un singolo oggetto con funzioni come $database->get_user_from_id($ID) sarebbe una buona idea. Le funzioni restituiscono oggetti (non matrici) e il codice front-end non si preoccupa mai del database.

Questo è stato fantastico, fino a quando non abbiamo iniziato a crescere il database. Ora ci sono oltre 30 tabelle e circa 150 funzioni nell'oggetto database. Sta diventando impraticabile e ingestibile e io lo spezzerò.

Qual è una buona soluzione a questo problema? Il progetto è grande, quindi c'è un limite nella misura in cui posso cambiare le cose.

Il mio piano attuale è di estendere l'oggetto corrente per ogni tabella, quindi contenere l'oggetto database. Quindi, l'esempio precedente si trasformerebbe in (supponiamo che "utente" sia una tabella) $database->user->get_user_from_id($ID) . Invece di un file di grandi dimensioni, avremmo un file per ogni tabella.

    
posta John Kershaw 06.09.2012 - 11:14
fonte

2 risposte

1

Prima di tutto, dimentica le tabelle. Le tabelle sono di archiviazione. Pensa invece alle tue lezioni. Spesso le classi possono essere salvate in una singola tabella, ma non sempre. Quindi non pensarli come intercambiabili. Sono molto cose diverse.

Quello che vuoi fare è spostare le query del database nelle tue classi. Mantieni il livello di astrazione del database: basta usarlo per eseguire query passate in esso.

Quindi, invece di questo:

$u = $database->user->get_user_from_id($ID);

fai questo:

$u = new User( $ID);

Il costruttore della classe User gestirà il caricamento dell'utente dal db.

class User
{
   __construct( $id)
   {
      global $database;

      $database->Query( "select name, etc... from users where id = ?", $id);
      //load the object from query result
   }
}

Quindi lo estendi in modo che possa svolgere altre attività:

$u = new User( $ID);
$u->Email = "[email protected]";
$u->Save();

Dove Save () potrebbe essere

function Save()
{
   global $database;  //there are other ways to do this, but you get the idea


   $database->query("update users set ......");

}

Ora in realtà le classi fanno ciò che dovrebbero fare - la classe User si preoccupa degli utenti. La classe Database si preoccupa della connessione al database.

    
risposta data 02.10.2012 - 21:19
fonte
0

Quello che ti consiglierei è di creare una classe di database che sappia come eseguire i comandi sul database e restituire le cose in un modo che ti piace renderla espandibile e facile da usare, così puoi fare cose semplici come le seguenti.

$table('user')->select('*')->where('user_id', 1234, '=')->exec();

che faciliterà l'espansione non è il miglior esempio, ma guarda il record attivo come suggerito, anche quello in codice è abbastanza buono.

Quindi estendi a quella classe tutte le tabelle con le quali hai bisogno di lavorare. o raggruppali con il tipo di chiamata che dovrebbe rendere più facile per te mantenere tutto bello e aggiornato e avere classi più piccole.

    
risposta data 02.10.2012 - 20:30
fonte

Leggi altre domande sui tag