Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Il Model: Propel

La funzione di Propel all'interno del model di Symfony: spiegazione pratica
La funzione di Propel all'interno del model di Symfony: spiegazione pratica
Link copiato negli appunti

Symfony ha scelto per il suo framework di utilizzare Propel come ORM e questo usa Creole per effettuare l'astrazione del database. Propel e Creole sono talmente integrati in Symfony da essere considerati parte del framework.

Il compito di un ORM è quello di trasformare un database relazionale in una serie di classi di dati. Per fare questo l'ORM ha bisogno di una descrizione della base dati (schema) dove vengono riportate le tabelle, i campi ad esse appartenenti e le relazioni tra una tabella ed un'altra. Questo schema in Symfony viene memorizzato all'interno della directory config del progetto principale in un file chiamato schema.yml. La sintassi utilizzata per definire lo schema e quello definita dal linguaggio YAML. Per comprendere meglio come lavora Propel proviamo a fare un esempio.

Figura 5: Base Dati
Base Dati

In figura 5 viene riportata una base dati composta da tue tabelle LIBRI e TIPOLOGIE relazionate tra di loro attraverso il vincolo di foreign key (uno a molti) TIPOLOGIE.id - LIBRI.tipologie_id. rappresentata in rosso.

Listato 10: File schema.yml relativa alla base dati di figura 5

propel:
  tipologie:
    id: ~
    descrizione: { type: varchar(255), required: true }
    created_at: ~
  libri:
    id: ~
    tipologie_id: ~
    titolo: { type: varchar(255), required: true }
    autore: { type: varchar(255), required: true }
    editore: { type: varchar(255), required: true }
    ISBN: { type: char(13), required: true }
    created_at: ~

Notiamo innanzitutto come nello schema non sia presente il nome del database. Infatti questo viene riportato solo nel file di configurazione del DB (configdatabase.yml).

Listato 11: File database.yml

dev:
  propel:
    param:
      classname: DebugPDO
test:
  propel:
    param:
      classname: DebugPDO
all:
  propel:
    class: sfPropelDatabase
    param:
      classname: PropelPDO
      dsn: 'mysql:dbname=symfony_project;host=localhost'
      username: root
      password: null
      encoding: utf8
      persistent: true
      pooling: true

In questo modo è possibile utilizzare un database per ogni ambiente: tutti fanno riferimento allo stesso schema.

Se andiamo ad osservare il Listato 10 possiamo vedere come per prima cosa viene riportato il nome della connessione (propel, riga 1). Tale connessione serve per mantenere il collegamento tra i file database.yml e schema.yml. Secondo la sintassi YAML le parole chiavi devono terminare con : (due punti) e la struttura del database viene definita utilizzando l'indentazione (attenzione ad utilizzare gli spazi e non la tabulazione).

Nella generazione delle classi dati il nome delle tabelle definite nello schema vengono trasformate utilizzando la convenzione camelCase che elimina gli _ (underscore) e rende maiuscole le prime lettere di ciascuna parola. In alternativa si può esplicitamente indicare di utilizzare un determinato nome per la classe attraverso l'attributo phpName (vedi Listato 12, rigo 3 e rigo 8)

Listato 12: File schema.yml

propel:
  tipologie:
    _attributes: { phpName: TipoLibro }
    id: ~
    descrizione: { type: varchar(255), required: true }
    created_at: ~
  libri:
    _attributes: { phpName: Libro }
    id: ~
    tipologie_id: ~
    titolo: { type: varchar(255), required: true }
    autore: { type: varchar(255), required: true }
    editore: { type: varchar(255), required: true }
    ISBN: { type: char(13), required: true }
    created_at: ~

Per quanto riguarda le colonne delle tabelle Symfony offre la possibilità di definire alcuni attributi.

Se per una colonna non viene definito nessun attributo sarà Symfony ad assegnare ad essa il migliore possibile in base ad una serie di regole utilizzate dal framework. Nel Listato 13, ad esempio, la colonna id di ciascuna tabella (rigo 4) non ha attributi. Symfony assegnerà a quel campo un vincolo di primary key e lo definirà come un integer auto-incrementante. Per la colonna tipologie_id (rigo 10) Symfony assegnerà un vincolo di foreign key con il campo id della tabella tipologie.

Altrimenti, se si vogliono definire uno o più attributi per le colonne, bisogna specificare almeno il tipo di dato. Symfony supporta, tra gli altri, i principali tipi utilizzati nelle normali applicazioni e che vengono riportati nella tabella di seguito. Per una completa lista dei tipi supportati da Symfony si rimanda alla documentazione ufficiale.

Categoria Tipo Note
Booleani boolean
Numerici integer, float
Temporali date, timestamp I tipi che rappresentano le date seguono le limitazioni imposte dalle date Unix, ovvero non possono essere antecedenti al 1970-01.01. Per date più remote è necessario usare tipi "before Unix" come bu_date e bu_timestamp.
Stringhe varchar, longvarchar varchar considera stringhe fino a 255 caratteri, longvarchar stringhe anche più lunghe. Il tipo longvarchar in MySQL viene convertito in text e, comunque, non può superare i 64KB.

Altri attributi possono essere specificati per ciascuna colonna come ad esempio il valore di default, se il campo può assumere il valore NULL oppure no e così via. Gli attributi vengono elencati di seguito al nome della colonna seguito da : (due punti) e all'interno di parentesi graffe {} come lista di una coppia attributo: valore, separate dalla virgola.

Anche le colonne possono avere l'attributo phpName per definire nelle classi dati un nome diverso da quello utilizzato nel database.


Ti consigliamo anche