Zend Framework - Modelli e database

In questo capitolo, discuteremo dei vari modelli e del database di Zend Framework.

Modelli in Zend Framework

Un modello definisce la rappresentazione logica dei dati dell'applicazione. Ad esempio, in un'applicazione di carrello degli acquisti - Prodotto, Cliente, Carrello e Ordini sono modelli. Definiscono le proprietà dell'entità che detiene. Alcuni dei concetti di modelli sono i seguenti:

  • I controllori comunicano con i modelli e chiedono loro di recuperare le informazioni di cui hanno bisogno. Queste informazioni recuperate vengono quindi passate dal controller alla visualizzazione. Infine, View renderà il modello come dati di presentazione utilizzabili dall'utente.

  • È molto raro che un modello interagisca direttamente con una vista, ma a volte può accadere.

  • I modelli possono parlare tra loro e non sono autonomi. Hanno rapporti tra loro. Queste relazioni rendono più facile e veloce per un controllore ottenere informazioni, poiché non deve interagire con modelli diversi; i modelli possono farlo da soli.

Diamo un'occhiata a un semplice modello: MyModel

<?php  
namespace Tutorial\Model;  
class Book { 
   public $id; public $author; 
   public $title; 
}

Database in Zend Framework

Il framework Zend fornisce una classe semplice e ricca di funzionalità, Zend \ Db \ TableGateway \ TableGateway per trovare, inserire, aggiornare ed eliminare i dati da una tabella di database.

Vediamo come collegare il file MySqlservice tramite il driver PDO di PHP nel framework Zend attraverso i seguenti passaggi.

Passaggio 1: crea il database in MySQL

Crea database tutorialsnel server MySQL locale. Possiamo usarephpmyadmino qualsiasi altro strumento GUI MySQL per questo scopo. Usiamo ilMySQL clientnel prompt dei comandi. Connettiti al server mysql ed esegui il seguente comando per creare il filetutorial Banca dati.

create database tutorials

Passaggio 2: creare una tabella nei tutorial db

Creiamo ora un database book nel tutorials db utilizzando il seguente comando SQL.

use tutorials;  
CREATE TABLE book ( 
   id int(11) NOT NULL auto_increment, 
   author varchar(100) NOT NULL, 
   title varchar(100) NOT NULL, 
   PRIMARY KEY (id) 
);

Passaggio 3: popolare i dati nella tabella del libro

Popolare il booktabella con dati di esempio. Usa il seguente comando SQL.

INSERT INTO book (author, title) VALUES ('Dennis Ritchie', 'C Programming'); 
INSERT INTO book (author, title) VALUES ('James gosling', 'Java Programming'); 
INSERT INTO book (author, title) VALUES ('Rasmus Lerdorf', 'Programming PHP');

Passaggio 4: aggiorna la connessione al database

Aggiorna il file di configurazione globale, che è - myapp / config / autoload / global.php con le informazioni necessarie sull'unità del database.

<?php 
return array( 
   'db' => array( 
      'driver' => 'Pdo', 
      'dsn' => 'mysql:dbname = tutorials;host = localhost', 
      'driver_options' => array( 
         PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
      ), 
   ), 
   'service_manager' => array( 
      'factories' => array(  
         'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', 
      ), 
   ), 
);

Passaggio 5: aggiorna le credenziali del database

Aggiorna le credenziali del database nel file di configurazione locale, che è - myapp / config / autoload / local.php. In questo modo, possiamo separare le credenziali di connessione del database locale e live.

<?php 
return array( 
   'db' => array( 
      'username' => '<user_name>', 
      'password' => '<password>', 
   ), 
);

Passaggio 6: creare un modello per il libro

Creiamo un modello, Book nel nostro modulo srcdirectory. Generalmente, i modelli sono raggruppati nella cartella Model - /myapp/module/Tutorial/src/Model/Book.php.

<?php  
namespace Tutorial\Model;  
class Book { 
   public $id; 
   public $author; public $title; 
}

Passaggio 7: implementare exchangeArray nel modello di libro

Il TableGateway interagisce con un modello attraverso il exchangeArrayfunzione. L'argomento standard della funzione exchangeArray è il set di risultati del database archiviato come array PHP. Usando ilexchangeArrayfunction, la proprietà di un modello può essere facilmente sincronizzata con la tabella del database corrispondente.

Aggiorna il modello, Book come mostrato di seguito -

<?php  
namespace Tutorial\Model;  
class Book { 
   public $id; public $author; 
   public $title; public function exchangeArray($data) { 
      $this->id = (!empty($data['id'])) ? $data['id'] : null; $this->Author = (!empty($data['author'])) ? $data['author'] : null; 
      $this->Title = (!empty($data['title'])) ? $data['title'] : null; 
   } 
}

Passaggio 8: utilizzare TableGateway per recuperare il libro

Crea una classe, BookTableper recuperare le informazioni sul libro dal database. Crea la classe, BookTable inModel cartella stessa.

<?php  
namespace Tutorial\Model;  
use Zend\Db\TableGateway\TableGatewayInterface;  
class BookTable {
   protected $tableGateway; 
   public function __construct(TableGatewayInterface $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet; 
   } 
}

Abbiamo usato select()metodo della classe TableGateway per recuperare le informazioni sul libro dal database. Ma non abbiamo usato alcun riferimento alla tabella -booknel codice. Il TableGateway è di natura generica e può recuperare i dati da qualsiasi tabella utilizzando determinate configurazioni. Di solito, queste configurazioni vengono eseguite inmodule.config.php file, di cui parleremo nei passaggi successivi.

Passaggio 9: configurare la classe BookTable

Aggiorna il modulo tutorial, Module.php con il getServiceConfig() metodo.

<?php
namespace Tutorial;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;

class Module implements ConfigProviderInterface {
   
   public function getConfig() {
      return include __DIR__ . '/../config/module.config.php';
   }
   public function getServiceConfig() {
      return [
         'factories' => [
            Model\BookTable::class => function ($container) { $tableGateway = $container->get(Model\BookTableGateway::class); $table = new Model\BookTable($tableGateway); return $table;
            },
            Model\BookTableGateway::class => function ($container) { $dbAdapter = $container->get(AdapterInterface::class); $resultSetPrototype = new ResultSet();
               $resultSetPrototype->setArrayObjectPrototype(new Model\Book()); return new TableGateway('book', $dbAdapter, null, $resultSetPrototype);
            },
         ],
      ];
   }
}

Qui abbiamo registrato il file BookTableclasse utilizzando il gestore del servizio. La classe BookTable viene utilizzata per recuperare le informazioni sul libro e, registrandole, possiamo accedervi ovunque sia necessario. Poiché i servizi registrati sono condivisi, aumentano le prestazioni, riducono il consumo di memoria, ecc.

Un altro elemento, Model \ BookTableGateway :: class è l'oggetto TableGateway specializzato per Book modello ed è una dipendenza del BookTable.

Passaggio 10: aggiorna la configurazione di TutorialController

Abbiamo bisogno di BookTableservizio nel controller del tutorial per recuperare le informazioni sul libro. Per ottenere il servizio BookTable, registralo come dipendenza del costruttore nel TutorialController.

Questa dipendenza dal costruttore aiuta a ottenere il servizio BookTable mentre il controller stesso è nella fase di inizializzazione. Aggiorna la sezione controller della configurazione del modulo tutorial,module.config.php come mostrato di seguito.

'controllers' => [ 
   'factories' => [ 
      Controller\TutorialController::class => function($container) { 
         return new Controller\TutorialController( 
            $container->get(Model\BookTable::class) 
         ); 
      }, 
   ], 
],

Passaggio 11: aggiorna il controller del tutorial

Questo viene fatto aderendo ai seguenti tre passaggi.

  • Aggiungi il costruttore con BookTable come argomento.
private $table;
public function __construct(BookTable $table) { $this->table = $table; 
}
  • Recupera le informazioni sul libro utilizzando il BookTable's fetchAll() metodo e registrarlo nella vista.

public function indexAction() { 
   $view = new ViewModel([ 
      'data' => $this->table->fetchAll(), ]); return $view; 
}
  • Visualizza le informazioni sul libro nello script di visualizzazione.

<table class = "table"> 
   <tr> 
      <th>Author</th> 
      <th>Title</th> 
      <th> </th> 
   </tr> 
   <?php foreach ($data as $sampledata) : ?> 
   <tr> 
      <td><?php echo $this->escapeHtml($data->author);?></td>  
      <td><?php echo $this->escapeHtml($data->title);?></td> 
   </tr> 
   <?php endforeach ?> 
</table>

Passaggio 12: eseguire l'applicazione

Controlla l'applicazione eseguendo - http://localhost:8080/tutorial.