Rieccoci qui a riprendere il discorso sul nostro RAD PHP preferito. Stavolta parleremo di Database, Data Model e accesso ai dati
Il Symfony Book accenna a questi argomenti nel capitolo 1, ma li affronta con maggior dettaglio nel capitolo 8. Io ve ne parlerò ora perchè credo siano il cuore dello sviluppo di una Web Application.
Come ben sappiamo sia Symfony che PHP5 sono Object-Oriented, ma i database sono di norma Relazionali. È utile dunque ricorrere ad una interfaccia che sia in grado di tradurre la “logica degli oggetti” nella “logica relazionale. Questa interfaccia è detta ORM (Object-Relational Mapping) Layer, ed è costituita da set di oggetti in grado di astrarre l’accesso ai dati. Il Layer ORM garantisce una elevata riusabilità del codice e permette di focalizzarsi sulla logica dell’applicazione e non sul data model di riferimento.
Un altro aspetto da tenere in considerazione è rappresentato dalle frequenti differenze di sintassi nei linguaggi SQL di Database Management System (DBMS) dei vari vendor. A causa di tali diversità la necessità operativa di passare ad un differente DB Engine, si concretizza in un dispendio di ore (alla meglio) per la riscrittura delle query costruite ad hoc per l’accesso al precedente DB Engine. L’indipendenza dai DB Engine divieni quindi fondamentale ed è garantita dal ricorso al Database Abstraction Layer.
L’abstracion layer ci consente di scrivere delle query in un linguaggio indipendente dal DBMS e di lasciare che sia questo strato ad occuparsi di generare ed eseguire il codice SQL reltivo al DBMS utilizzato. L’abstraction layer permette di passare ad un altro DBMS anche durante lo sviluppo dell’applicazione minimizzando le operazioni di riscrittura e adattamento del codice.
Symfony garantisce queste funzionalità integrando al suo interno Propel come ORM Layer e Creole come DB Abstraction Layer (entrambi sviluppati dal Propel Team).
Connessione al Database
Benchè Propel e Creole ci consentano un elevato grado di astrazione dal data model e dal database, non sono di certo onniscienti. Per rendere disponibili le nostre configurazioni a Propel e Creole dobbiamo editarle nel file project/config/databases.yml come nell’esempio che segue per mysql:
all: # environement per le configurazioni
propel:
class: sfPropelDatabase
param:
phptype: mysql # DBMS usato [mysql|pgsql|sqlite|oracle]
host: localhost # server DBMS
database: db_name
username: db_user
password: db_pass
port: 3306 # porta di default per mysql
encoding: utf-8 # charset per la creazione delle tabelle
persistent: true # utilizzare connessioni persistenti
protocol: unix # tipo di protocollo di comunicazione
socket: /path/to/mysql.sock # percorso del socket di mysql
Le configurazioni sono environment-dependent, possono cioè essere differenti per gli environment di produzione [prod], di sviluppo [dev] o di test [test] o altri propri della nostra applicazione. Queste configurazioni possono essere sovrascritte dall’applicazione editando il file project/apps/application-name/config/databases.yml.
Ora Propel attraverso Creole è in grado di comunicare con il DBMS. quello che ci manca ora è costruire il nostro data model per strutturare il DB e per generare le classi per il Layer ORM. Alla prossima dunque.