Main Menu




browser lang:en

Users Area

Client Login

today cache size is:222615

 

Holyguard rss
rss 2.0 for all sections

 

Portfolio

Some of my projects:
CTIBA
MA-NO Web Agency
BluPool
L'Pratone
Travel in Hotel
Yacht Elements
AbruzzoWeb
Il Mastino
CSI Teramo
Innovazione S.p.a.




Commenti

ciao jackall
17/07/2010 by marco
aiuto
17/07/2010 by marco
RE: Domanda
08/05/2010 by holyguard
Domanda
05/05/2010 by pryons
Ringraziamento
15/04/2010 by Yuriy, webmaster
edu
12/04/2010 by eduala@libero.it
eing ?
16/03/2010 by Andreu
zend
16/03/2010 by holy

Leggi tutto »


RAPIDQ

Rapid-Q:The lost files
My old library where i have collected all the rapidq scripts and italian help


Today my pagerank is: Free Page Rank Tool

PHP e MVC - Un esempio di Model View Controller

Cosa è MVC?

Model View Controller è un modello di architettura software, che è ampiamente utilizzato in applicazioni Web, suddivise in tre strati (modello, vista e controller)

* Il Modello è responsabile di interagire con il database ed esegue regole di negoziazione.
* Il Controller processa le richieste della pagina web (la vista), e invia i dati al Modello, in modo tale che questi restituisca le informazioni appropriate per la visualizzazione in Vista.
* La Vista è il codice HTML che viene visualizzato per l'utente con informazioni da parte del controller.

Vantaggi di utilizzo.

Facilità di manutenzione del codice, in futuro, già che hanno il vantaggio di avere i diversi processi separati, a seconda della loro tipologia.
Se si desidera ad esempio cambiare il tipo di database, è necessario solo cambiare il codice di Modello.

Per una migliore comprensione delle architetture, mostro la trasformazione di un elenco di articoli di un blog.

Questo è il codice PROCEDURALE che elenca gli oggetti (ossia il codice che solitamente usiamo in PHP)




<?
// connessione alla base di dati
$cn = mysql_connect('localhost', 'utente', 'password');
mysql_select_db('db', $cn);

// consultiamo SQL per ottenere gli articoli
$risultato=mysql_query('SELECT data, titolo FROM articolo', $cn);
?>
<h1>Listato di articoli</h1>

<table>
     <tr> <th>Data</th> <th>Titolo</th> </tr>
<?php

// stampa il risultato
while ($riga = mysql_fetch_array($risultato, MYSQL_ASSOC))
{
    echo "<tr>";
    echo "<td> ".$riga['data']." </td>";
    echo "<td> ".$riga['titolo']." </td>";
    echo "</tr>";
}
?>

</table>

<?php
//chiudiamo la connessione
mysql_close($cn);
?>

Commenti

* Sulla stessa pagina ci si connette al server (funziona solo se MySQL) e selezioniamo un database.
* Realizziamo una richiesta (nessun errore di manipolazione e / o eccezioni).
* Disegnamo il codice HTML (combiniamo il codice HTML con i codici di PHP all'interno, lasciando i tag (<tr>, <td>) illeggibili per la persona che inserisce gli stili).

Dividere in due file

L'esempio di cui sopra, lo possiamo separare in due file, uno chiamato Controller e l'altro Vista.

Controller.php

<?
$cn = mysql_connect('localhost', 'utente', 'password');
mysql_select_db('db', $cn);

$risultato = mysql_query('SELECT data, titolo FROM articolo', $cn);
$articoli = array();

while($articolo = mysql_fetch_assoc($risultato))
{
    $articoli[] = $articolo;
}

mysql_close();

require('vista.php');
?>

Vista.php
<h1>Listato di Articoli</h1>
<table>
     <tr> <th>Data</th> <th>Titolo</th> </tr>

<?php foreach($articoli as $articolo): ?>
    <tr>
        <td><?php echo $articolo['Data']?></td>
        <td><?php echo $articolo['titolo']?></td>

    </tr>
<?php endforeach;?>
</table>

In questo modo abbiamo separato nel Controller.php la maggior parte del codice php con la logica di negozio, mentre in Vista.php inseriamo solo un array con i dati.
La cosa migliore sarebbe usare le istruzioni PHP più comuni in Vista, come if, endif, foreach, endforeach. E di non utilizzare le parentesi "{" che rimangono difficili da riconoscere all'inizio e alla fine.

Un altro grave problema è se vogliamo utilizzare di nuovo il listato in un'altra pagina, ci sarebbe di riscrivere il Controller.php.
Per questo suddivideremo il Controller che (controlador.php) in Modello.php e Controller.php.

Modello.php

<?php

function getArticoli()
{
    $cn = mysql_connect('localhost', 'utente', 'password');
    mysql_select_db('db', $cn);

    $risultato = mysql_query('SELECT data, titolo FROM articolo', $cn);
    $articoli = array();

    while($articolo = mysql_fetch_assoc($risultato))
    {
        $articoli[] = $articolo;
    }

    mysql_close();
}
?>


Controller.php
require('modello.php');

$articoli = getArticoli();

require('vista.php');


Dopo questa separazione il Controller sarebbe solo come un agente per trasmettere i dati dal Modello alla Vista, ma in applicazioni più complesse è il driver che esegue i compiti di autenticazione degli utenti, gestione delle sessioni, filtraggio e validazione dell'immissione dei dati da GET o POST.

Cosa succede se cambio gestore di database?

La risposta sarebbe cambiare tutte le caratteristiche del Modello (mysql_connect, mysql_query, ...), per il corrispondente caso, e che richiederebbe molto tempo.
Per fare un migliore uso delle MVC o per meglio dire cambiare un po il Modello, il Modello potrebbe essere separato in due strati:

* Il livello di accesso ai dati
* Il livello di astrazione del database

Se si desse il caso di cambiare di gestore di database dovremmo solo aggiornare il layer di astrazione del database

Esempio di due strati

Astrazione dei dati
function creareConnessione($server, $utente, $password)
{
  return mysql_connect($server, $utente, $password);
}

function chiudereConnessione($cn)
{
  mysql_close($cn);
}

function consulta($consulta, $base_dati, $cn)
{
  mysql_select_db($base_dati, $cn);

  return mysql_query($consulta, $cn);
}

function getRisultato($risultato, $tipo = MYSQL_ASSOC)
{
  return mysql_fetch_array($risultato, $tipo);
}


Accesso ai dati

function getTuttiGliArticoli()
{
  $cn = creareConnessione('localhost', 'utente', 'password');

  $risultato=consulta('SELECT data, titolo FROM articolo', 'db', $cn);

  $articoli = array();
  while ($articolo = getRisultato($risultato))
  {
     $articoli[] = $articolo;
  }

  chiudereConnessione($cn);

  return $articoli;
}



Abbiamo ora il livello di accesso ai dati senza alcuna dipendenza di funzioni di gestione di database, e saremo in grado di riutilizzare le funzioni nel database abstraction layer di accesso ai dati in altre caratteristiche del nostro Modello.

Rating:
53.0
17 votes
1 2 3 4 5

Commenti

zend by holy

16/03/2010 
ya ya, este es solo para empezar :-)


Zend Framework by Andreu

16/03/2010 
Para implementar el sistema "mvc" te puedes mirar el framework de zend, esta muy muy bien.


corretto articolo MVC by admin

31/08/2009 
Grazie per i commenti, ho corretto l'articolo.

Un saluto a tutti


Davvero niente male Holy complimenti by GreyWolf

31/08/2009 
Complimenti la tua guida offre un chiarimento su questo concetto che è davvero ancora poco diffuso anche all'interno di moltte web agency. Come anche tu hai anticipato non è che sia obbligatorio utilizzare l'MVC ma sicuramente rende il codice molto più pulito.

Faresti cosa davvero molto gradita se puoi sistemare il controller e il modello così che non siano più inveriti e magari se ti è possibiile fare una guida che si riaggancia a questa e magari approfondisce un po di più. Grazie davvero ottimo lavoro e gran bel sito!


re:controller.php e modello.php by holy

07/07/2009 
di niente, tieni in conto che questa è una visione molto semplicistica.
Spulciando nella rete puoi trovare esempi che approfondiscono ed integrano il concetto di routing in php.


controller.php e modello.php by lorenza

07/07/2009 
Ok, era solo un mio scrupolo per sapere se avevo realmente capito l'MVC. (E' la prima volta che mi cimento con questo framework!)
Ottimo tutorial grazie! :)


effettivamente by holy

07/07/2009 
effettivamente si, è un errore che non ho mai corretto


controller.php e modello.php by lore

06/07/2009 
Ciao,
ma il listato inerente alla suddivisione tra controller.php e modello.php sono invertite?
Grazie mille


Inserisci un commento

Titolo
Messaggio
Nome Utente
e-mail (se vuoi ricevere le risposte a questo post anche via mail)

Videos


Contenuti

Artweaver

28/05/2010 

Artweaver è un programma di disegno dotato di un'infinità di pennelli con cui sperimentare nuove tecniche grafiche.…

in:Software Open Source (0 commenti)

Configurare Domini e Sottodomini con BIND + Postfix

23/03/2010 

Con Bind, la configurazione di domini e sottodomini è abbastanza semplice....l'elemento più importante è il cosidetto zone-file, che…

in:Apache (0 commenti)

hkit - classi in php per il parsing dei microformats

05/03/2010 

hkit é un tool, o meglio, una classe in PHP5 per la estrazione dei piú comuni microformati.  La pagina…

in:PHP Scripts (0 commenti)

Certificati Java

01/03/2010 

Dopo circa un anno ho ritirato i certificati che attestano i miei corsi di Java...purtroppo manca il terzo…

in:Blog (3 commenti)

SVNWeaver, integrare subeversion in Dreamweaver

19/02/2010 

SVNWeaver é una estensione per Dreamweaver che permette di integrare il TortoiseSVN nei menú del Dreamweaver. Devo dire…

in:Applicazioni di sviluppo web (0 commenti)

Inserisci Google BUZZ nel tuo sito con Google Buzz Widget Jquery Plugin

15/02/2010 

Questo è un widget di jQuery per il nuovo social network di Google-Buzz-che è possibile incorporare ovunque per…

in:Scripts e tutorials (0 commenti)

Come posso inserire codice HTML nei miei post?

14/02/2010 

Questa é la classica situazione in cui si deve postare codice HTML da mostrare agli utenti. In questo…

in:HolyFaqs (0 commenti)

Mostrare una immagine da un Database MYSQL con PHP

14/02/2010 

Nella rete possiamo trovare diversi script che ci spiegano come estrapolare immagini da un database mysql (ed anche…

in:PHP Scripts (0 commenti)

Leggi tutto »


Tag Clouds


ArtweaverConfigurare Domini Sottodomini BIND Postfixhkit classi parsing microformatsCertificati JavaSVNWeaver integrare subeversion DreamweaverInserisci Google BUZZ sito Google Buzz Widget Jquery PluginCome posso inserire codice HTML miei postMostrare immagine Database MYSQL


Add to Technorati Favorites