Symfony è basato sul modello di programmazione MVC. A differenza della programmazione classica dove potremo in una sola pagina programmare tutta la nostra applicazione nel modello MVC dividiamo il codice in Model (modello), View (vista), Controller (controllore).

Programmazione classica in un’unico script:

– difficile da mantenere perchè di difficile lettura
– impossibile da affidare a tecnici che non abbiano la conoscenza di tutti i linguaggi utilizzati


<?php
 
// Connessione e selezione del database
$link = mysql_connect('localhost', 'myuser', 'mypassword');
mysql_select_db('blog_db', $link);
 
// Esecuzione query SQL
$result = mysql_query('SELECT date, title FROM post', $link);
 
?>
 
<html>
  <head>
    <title>List of Posts</title>
  </head>
  <body>
   <h1>List of Posts</h1>
   <table>
     <tr><th>Date</th><th>Title</th></tr>
<?php
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
echo "\t<tr>\n";
printf("\t\t<td> %s </td>\n", $row['date']);
printf("\t\t<td> %s </td>\n", $row['title']);
echo "\t</tr>\n";
}
?>
    </table>
  </body>
</html>
 
<?php
 
// Chiusura connessione
mysql_close($link);
 
?>

Pattern MVC

Per semplicità in questi esempi utilizziamo un paradigma di programmazione procedurate senza usare la programmazione orientata agli oggetti (OOP) con classi, metodi e proprietà.

model.php solo manipolazione dei dati


function getAllPosts()
{
  // Connessione al database
  $link = open_connection('localhost', 'myuser', 'mypassword');
 
  // Esecuzione query SQL
  $result = query_database('SELECT date, title FROM post', 'blog_db', $link);
 
  // Popolamento dell'array
  $posts = array();
  while ($row = fetch_results($result))
  {
     $posts[] = $row;
  }
 
  // Chiusura connessione
  close_connection($link);
 
  return $posts;
} 

astrazione del database per separare le query di connessione.
Si potrebbero scrivere diverse query in base al tipo di DB (MySQL, PostgreSQL) senza modificare model.php


<?php
 
function open_connection($host, $user, $password)
{
  return mysql_connect($host, $user, $password);
}
 
function close_connection($link)
{
  mysql_close($link);
}
 
function query_database($query, $database, $link)
{
  mysql_select_db($database, $link);
 
  return mysql_query($query, $link);
}
 
function fetch_results($result)
{
  return mysql_fetch_array($result, MYSQL_ASSOC);
}

view.php solo vista HTML


<html>
  <head>
    <title>List of Posts</title>
  </head>
  <body>
    <h1>List of Posts</h1>
    <table>
      <tr><th>Date</th><th>Title</th></tr>
    <?php foreach ($posts as $post): ?>
      <tr>
        <td><?php echo $post['date'] ?></td>
        <td><?php echo $post['title'] ?></td>
      </tr>
    <?php endforeach; ?>
    </table>
  </body>
</html>

index.php il controllore, gestisce la logica business, cioè preleva i dati dal model, li manipola, scrive nella view.


<?php
 
// Richiesta del modello
require_once('model.php');
 
// Recupero della lista dei post
$posts = getAllPosts();
 
// Richeista della vista
require('view.php');

La vista può essere suddivisa in:

– Layout


<html>
  <head>
    <title><?php echo $title ?></title>
  </head>
  <body>
    <?php include('mytemplate.php'); ?>
  </body>
</html>

– Template


<h1>List of Posts</h1>
<table>
<tr><th>Date</th><th>Title</th></tr>
<?php foreach ($posts as $post): ?>
  <tr>
    <td><?php echo $post['date'] ?></td>
    <td><?php echo $post['title'] ?></td>
  </tr>
<?php endforeach; ?>
</table>

In Symfony la struttira MVC sarà la seguente:

# Model layer
– Astrazione del Database
– Accesso ai Dati

# View layer
– Layout disposizione (tag comuni html, head, body, footer) in Symfony app\Resources\views\base.html.twig
– Template modello (codice specifico) in Symfony app\Resources\views\default

# Controller
– Front controller (è unico in tutta l’applicazione, sicurezza, configurazione) in Symfony web\app.php e app_dev.php
– Action (azioni specifiche di quella pagina), in Symfony src\AppBundle\Controller\ilcontrollerfile.php -> nomefunzioneAction()

Bibliografia:
symfony.com/legacy/doc/gentle-introduction/1_4/it/01-introducing-symfony