Riprendiamo il nostro viaggio alla scoperta di Zend Framework, analizzando le varie parti del progetto che abbiamo creato nel precedente post con Zend_Tool.

Ma prima importiamo il progetto all’interno del nostro IDE, così da poterci lavorare in modo più agevole.

Import del progetto

Apriamo Eclipse e creiamo un nuovo progetto PHP: clicchiamo in alto a sinistra su ‘File -> New -> PHP Project’, diamogli il nome myapplication, lasciamo le impostazioni di default e premiamo il tasto ‘Finish’.

A questo punto clicchiamo il tasto destro del mouse sul nuovo progetto e selezioniamo l’opzione ‘Import…’: non appena si aprirà la relativa finestra clicchiamo su ‘General -> File System’ e procediamo con ‘Next’.

Non ci resta che selezionare la directory in cui si trova il progetto creato precedentemente: clicchiamo in alto a destra su ‘Browse..’, selezioniamo la cartella del progetto, premiamo ‘Ok’; una volta caricato lo ‘checkiamo’ nel riquadro alla nostra sinistra e concludiamo l’importazione premendo il tasto ‘Finish’.

Se tutto è andato a buon fine, questo è quello che vedrete:

Un consiglio che vi posso dare per velocizzare lo sviluppo della vostra applicazione è quella di creare il workspace direttamente nella cartella htdocs di Apache: in questo modo non dovrete ogni volta ricopiare la cartella del progetto all’interno del server, ma ad ogni salvataggio vedrete già i cambiamenti che avrete apportato.

Passiamo adesso a vedere i file principali dell’applicativo, analizzandone il contenuto.

File di configurazione: application.ini

L’application.ini è il file di configurazione dell’applicativo; qui di seguito è riportato il contenuto di quello nostro.

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.dbname = my-database
resources.db.params.username = inserire qui il proprio username di accesso a phpMyAdmin
resources.db.params.password = inserire qui la propria password di accesso a phpMyAdmin

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

All’interno del file possiamo suddividere la configurazione dell’applicativo in base all’ambiente in cui stiamo lavorando; nel nostro esempio ci sono 2 diversi ambienti:

  • Production: rappresenta la configurazione finale da utilizzare nel momento in cui l’applicativo sarà completato e pronto per l’uso.
  • Development: rappresenta la configurazione che utilizzeremo durante la fase di sviluppo e test dell’applicativo.

Per impostare quale configurazione vogliamo utilizzare, basterà cambiare il valore della variabile APPLICATION_ENV presente nel file .htaccess.

Da notare la dicitura:

[development : production]

Essa sta a significare che le impostazioni dell’ambiente development ereditano quelle dell’ambiente production.

Gli ultimi 5 parametri presenti nella configurazione di produzione serviranno per connetterci al database:

resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.dbname = my-database
resources.db.params.username = inserire qui il proprio username di accesso a phpMyAdmin
resources.db.params.password = inserire qui la propria password di accesso a phpMyAdmin

File .htaccess

Il file .htaccess è un altro file di configurazione che ci permetterà principalmente di reindirizzare tutte le richieste al file index.php (che vedremo subito dopo) e di settare la variabile d’ambiente APPLICATION_ENV.

SetEnv APPLICATION_ENV development

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

File di bootstrap: Index.php

index.php è quello che viene definito il file di bootstrap: il suo compito è quello di instanziare e lanciare l’applicativo.

<?php 
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

Andiamo ora a vedere il cuore dell’applicazione, e cioè il contenuto della cartella application.

Il modello dei dati

Per poterci interfacciare con una tabella del database dovremo creare una classe che estende Zend_Db_Table_Abstract.

Aggiungiamo quindi il nuovo file, chiamato Books.php, come riportato nell’immagine di seguito:

ed inseriamo al suo interno il seguente codice:

<?php

class Application_Model_DbTable_Books extends Zend_Db_Table_Abstract
{
    protected $_name = 'libri';
}

La variabile $_name è obbligatoria e rappresenta il nome della tabella.

A questo punto possiamo accedere a qualsiasi campo della tabella o effettuare qualsiasi operazione di persistenza dei dati, non dovremo fare altro che arricchire la classe con i metodi che implementano la logica che vogliamo.

Vediamo qui di seguito un esempio di un metodo che, dato l’identificativo di un libro (campo id della tabella libri), ne restituisce la riga associata:

public function getBook($id)
{
    $id = (int)$id;
    $row = $this->fetchRow('id = ' . $id);
    return $row->toArray();
}

Il controllo: IndexController.php

Nel file IndexController.php troveremo la logica di business dell’applicativo.

Quando vogliamo visualizzare una pagina (nel nostro caso index.php, la pagina principale dell’applicazione) Zend Framework eseguirà il codice della Action associata alla pagina e, una volta conclusa, renderizzare la vista.

Per capire quale action è associata ad una pagina Zend Framework non farà altro che guardarne il nome: infatti la function dovrà seguire la sintassi nomepaginaAction e di conseguenza la nostra si chiamerà indexAction.

<?php
class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        $books = new Application_Model_DbTable_Books();
        $this->view->books = $books->fetchAll();
    }
}

Attraverso la riga di codice

$this->view->books = $books->fetchAll();

estrarremo tutte le righe presenti sulla tabella libri per poterle poi visualizzare nella pagina.

La vista: index.phtml

A questo punto non ci resta che concludere il nostro “giro” andando a scrivere il codice della vista index.phtml.

<table>
	<tr>
	    <th>Autore</th>
	    <th>Libro</th>
	</tr>
	
	<?php foreach($this->books as $book) : ?>
	<tr>
		<td><?php echo $this->escape($book->scrittore);?></td>
	    <td><?php echo $this->escape($book->titolo);?></td>
	</tr>
	<?php endforeach; ?>
</table>

Attraverso il costrutto del foreach non faremo altro che scorrere tutte le righe estratte precedentemente ed inserirle dentro la nostra tabella.

Hello Libreria!

Siamo arrivati alla fine e se tutto ha funzionato per il meglio, vedremo la libreria comparire sul nostro browser:

Conclusioni

Nella prima parte di questo post abbiamo visto la configurazione base dell’applicativo (file application.ini, .htdocs e index.php) e successivamente come implementare il modello dei dati (Books.php), il controllore (IndexController.php) e la vista (index.phtml) seguendo il pattern MVC.

Nel prossimo post concluderemo la libreria arricchendola di alcune funzionalità come l’inserimento, l’eliminazione e la modifica di un libro.

3 Posts

Sono laureato in Ingegneria Informatica e lavoro dal 2009 presso OmniaGroup dove ricopro il ruolo di Senior Developer. Sviluppo principalmente applicazioni web su piattaforma J2EE utilizzando IBM Websphere 6.1/7.0, JPA (Eclipselink), EJB3 e JSF (RichFaces). Lavoro anche nella realizzazione di processi di Business Intelligence con strutture di ipercubi sia di tipo ROLAP (attraverso SAP Business Object) che di tipo MOLAP (con la suite Oracle Hyperion) e con il supporto del Data warehouse Teradata.