1.5. Colleghiamo le classi per lavorare con il database e i template
Abbiamo creato la struttura del nostro framework, ora è il momento di pensare alla memorizzazione dei dati: notizie, prodotti. L’oggetto per lavorare con il database deve essere in grado di:
- Gestire la connessione al database
- Fornire un piccolo livello di astrazione dal database
- Memorizzare in cache le query
- Semplificare le operazioni comuni sul database
Per questo creeremo l’oggetto Registry/objects/db.class.php:
<?php /** * Gestione del database * Fornisce una leggera astrazione dal DB */ class database { ... } ?>
Prima di connetterci al database, vediamo cosa fa la nostra classe. Possiamo eseguire semplici operazioni di inserimento, aggiornamento e cancellazione tramite i metodi della classe:
// Inserimento $registry->getObject('db')->insertRecords( 'products', array('name'=>'Tazza' ) ); // Aggiornamento $registry->getObject('db')->updateRecords( 'products', array('name'=>'Tazza rossa' ), 'ID=2' ); // Eliminazione $registry->getObject('db')->deleteRecords( 'products', "name='Tazza rossa'", 5 );
La nostra classe supporta anche la memorizzazione nella cache delle query.
Ora aggiungiamo un altro oggetto per la gestione dei template: Registry/objects/template.class.php
<?php // Costante definita in index.php per evitare chiamate esterne non autorizzate if ( ! defined( 'FW' ) ) { echo 'Questo file può essere chiamato solo da index.php'; exit(); } /** * Classe per la gestione dei template */ class template { ... } ?>
Abbiamo anche definito la chiamata dell’oggetto Page nel sistema di template, quindi dobbiamo definirlo in Registry/objects/page.class.php:
<?php /** * La nostra classe per la pagina * Questa classe consente di aggiungere varie funzionalità utili, * come pagine protette da password, inclusione di file js/css, ecc. */ class page { ... } ?>
Ora che abbiamo creato le classi per lavorare con il database e i template, possiamo connetterle.
Creiamo il metodo storeCoreObjects() in Registry/registry.class.php:
public function storeCoreObjects() { $this->storeObject('database', 'db' ); $this->storeObject('template', 'template' ); }
In questo metodo definiamo quali classi saranno caricate automaticamente.
Aggiungiamo anche una tabella di esempio nel database: users, con i campi id, name ed email. Nel repository Git troverai il file SQL di esempio per questa tabella.
Ora mostriamo la homepage, creando il template Views/Templates/main.tpl.php:
<html> <head> <title>Powered by PCA Framework</title> </head> <body> <h1>Our Members</h1> <p>Below is a list of our members:</p> <ul> <!-- START members --> <li>{name} {email}</li> <!-- END members --> </ul> </body> </html>
Come puoi vedere, abbiamo impostato il tag members e i token {name}, {email}. Analizzeremo in dettaglio il funzionamento del sistema di template in un articolo successivo. Ora torniamo a index.php e colleghiamo il template e il database.
Ora il nostro file index.php appare così:
<?php session_start(); error_reporting(E_ALL); define( "APP_PATH", dirname( __FILE__ ) ."/" ); define( "FW", true ); function __autoload( $class_name ) { require_once('Controllers/' . $class_name . '/' . $class_name . '.php' ); } require_once('Registry/registry.class.php'); $registry = Registry::singleton(); $registry->storeCoreObjects(); $registry->getObject('db')->newConnection('localhost', 'root', '', 'framework'); $registry->getObject('template')->buildFromTemplates('main.tpl.php'); $cache = $registry->getObject('db')->cacheQuery('SELECT * FROM users'); $registry->getObject('template')->getPage()->addTag('users', array('SQL', $cache) ); $registry->getObject('template')->getPage()->setTitle('Our users'); $registry->getObject('template')->parseOutput(); print $registry->getObject('template')->getPage()->getContent(); print $registry->getFrameworkName(); exit(); ?>
Se tutto funziona correttamente e nel database sono presenti utenti, dovresti vedere un risultato simile a questo:
Se invece riscontri errori, è possibile che ci siano ancora piccole modifiche da apportare al codice nelle sezioni precedenti. Puoi controllare il codice funzionante completo su GitHub.
Ecco alcuni errori che ho corretto durante la scrittura di questa guida:
Rinominiamo la classe del database in Registry/objects/db.class.php:
-class database { +class db {
Ho inoltre definito i metodi statici dove necessario e aggiornato i percorsi nel file Registry/registry.class.php:
public static function storeObject( $object, $key ) { require_once('Registry/objects/' . $object . '.class.php'); self::$objects[ $key ] = new $object( self::$instance ); }
Infine, ho corretto un errore nel parser dei template in Registry/objects/template.class.php:
- $newContent = str_replace('<title>', '<title>'. $this->$page->getTitle(), $this->page->getContent() ); + $newContent = str_replace('<title>', '<title>'. $this->page->getTitle(), $this->page->getContent() );