Lydia: Separera SQL-satserna från PHP-koden

  • Författare
  • Meddelande
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11180
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Lydia: Separera SQL-satserna från PHP-koden

Inlägg24 feb 2012, 15:28

Detta är en del i tutorialen Lydia: ett PHP-baserat, MVC-inspirerat CMF. Senast uppdaterad 2012-03-22.

Ordning och reda, var sak har sin plats, all SQL på en plats gör det enkelt att underhålla och vidarutveckla ramverket och dess applikationer.


Separera SQL från PHP-koden

I många webbapplikationern blandar man in SQL-koden rakt in i PHP-koden. Det må vara ett smidigt sätt att koda men när det handlar om större kodmängder som skall underhållas så vill man gärna separera SQL-koden. Detta är bra då det blir enklare att få en komplett vy av vilka SQL-satser som används i applikationen. Det är sånt man vill se när man behöver ändra databasstrukturen eller kanske porta webbapplikationen till en annan databas.

Min tanke är att använda en interface-klass för detta, IHasSQL, som varje klass om använder sig av SQL skall implementera. Då kan jag få en översikt av de klasser som använder SQL genom att titta på de klasser som implementerar just detta interface. Det här kan jag automatisera om jag vill genom att använda PHP's reflection API.

När jag ändå gör detta interface så tvingar jag klasserna att lägga all SQL-kod i en metod. Då blir det samlat och jag kan titta i den metoden för att se vilka SQL-frågor som används.

Låt se hur det blir om vi inför detta i CCGuestbook.


Ett interface IHasSQL för de klasser som använder SQL

På samma sätt som tidigare så skapar jag en klassdefinition för själva interfacet.

src/IHasSQL/IHasSQL.php
Kod: Markera allt
<?php
/**
* Interface for class that interacts with the database to encapsulates all SQL requests.
*
* @package LydiaCore
*/
interface IHasSQL {
  public static function SQL($key=null);
}



CGuestbook implementerar interfacet IHasSQL

Bra, du uppgraderar jag gästboken till att implementera interfacet och flyttar samtliga SQL-satser till metoden SQL(). Så här blev det.

CCGuestbook implements IHasSQL
Kod: Markera allt
<?php
/**
* A guestbook controller as an example to show off some basic controller and model-stuff.
*
* @package LydiaCore
*/
class CCGuestbook extends CObject implements IController, IHasSQL {


All SQL-kod samlas i en metod. de som vill använda en SQL-sats skickar in en nyckel $key och som svar returneras själva SQL-satsen som en sträng.

CCGuestbook::SQL()
Kod: Markera allt
   /**
    * Implementing interface IHasSQL. Encapsulate all SQL used by this class.
    *
    * @param string $key the string that is the key of the wanted SQL-entry in the array.
    */
  public static function SQL($key=null) {
     $queries = array(
        'create table guestbook'  => "CREATE TABLE IF NOT EXISTS Guestbook (id INTEGER PRIMARY KEY, entry TEXT, created DATETIME default (datetime('now')));",
        'insert into guestbook'   => 'INSERT INTO Guestbook (entry) VALUES (?);',
        'select * from guestbook' => 'SELECT * FROM Guestbook ORDER BY id DESC;',
        'delete from guestbook'   => 'DELETE FROM Guestbook;',
     );
     if(!isset($queries[$key])) {
        throw new Exception("No such SQL query, key '$key' was not found.");
      }
      return $queries[$key];
   }


Den kod som använder SQL-satser får uppdateras på följande sätt.

CCGuestbook::DeleteAllFromDatabase()
Kod: Markera allt
/**
   * Delete all entries from the database.
   */
  private function DeleteAllFromDatabase() {
    $this->db->ExecuteQuery(self::SQL('delete from guestbook'));
  }


Sådär, det var det.


Summering & Test

Det vi uppnår är framförallt separation av koden, all SQL-kod separeras från PHP-delarna. Tänk att klassen vore 500 rader stor och tänk dig att du skall få en överblick av hur SQL-satserna används. Detta är ett sätt att göra detta på. Du kan som vanligt testa koden och studera källkoden på följande länkar.

http://dbwebb.se/lydia/tags/v0.1.6/guestbook
https://github.com/mosbth/lydia/tree/v0.1.6

Läs mer om "separations of concerns" på http://en.wikipedia.org/wiki/Separation_of_concerns

Fortsätt med nästa tutorial.
...
..:
.... /mos

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 33 gäster