Gestione corretta dei Model

Ciao, ho visto un po' di esempi sull'utilizzo corretto dell'MVC con Zend, come ad esempio il quickstart

nella mia applicazione ho qualche cosa tipo (per quanto riguarda il Model):

quindi con un file gestisco tutte le operazioni sul DB, per esempio della tabella utenti (Users)

<?php

class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract {

public function getUser($id) {

$id = (int)$id;
$row = $this->fetchRow('userId = ' . $id);
if (!$row) {
throw new Exception("Could not find row");
}
return $row->toArray();
}

...

in molti esempi on line (come quickstart) vedo invece che viene applicata questa soluzione

DbTable contiene solo

<?php

class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
    protected $_name = 'guestbook';
}

mentre tutto è gestito da

<?php

class Application_Model_Guestbook
{
    protected $_comment;
    protected $_created;
    protected $_email;
    protected $_id;

    public function __construct(array $options = null)
    {
        if (is_array($options)) {
            $this->setOptions($options);
        }
    }
....

e da un mapper

<?php

class Application_Model_GuestbookMapper
{
    protected $_dbTable;

    public function setDbTable($dbTable)
    {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;
        return $this;
    }

Che differenza c'è?

Grazie

inviato 6 anni fa
il_dandi
X 0 X

Io preferisco il metodo numero 1 se devo gestire solo una tabella o poche cose.

Comunque se possibile, se ottengo vantaggi preferisco usare degli oggetti figli di Zend_Db_Table.

Mi sembra che la cosa che più vari è la gestione logica dell'applicativo e del database ad esso associato. Il secondo metodo ti permette di gestire tutto un database intero.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Grazie per la risposta, quindi nella soluzione presente nel QuickStart

in Application_Model_DbTable_Guestbook indico **solo** la tabella da usare

in Application_Model_Guestbook definisco tutte le funzioni collegate al mapper??

il mapper application_Model_GuestbookMapper cosa rappresenta? definisco tutte le funzioni di chiamate al DB (update, insert)??

non capisco bene la relazione tra quanto inserito in Application_Model_Guestbook e application_Model_GuestbookMapper ed i vantaggi di questa gestione

Grazie

risposto 6 anni fa
il_dandi
X 0 X

Il promo metodo utilizza gli array per trasportare i dati dall'applicazione al database. Quindi nell'applicazione i dati "di business" sono impacchettati in un array che può essere gestito direttamente da un oggetto DbTable.

Se invece si decide di utilizzare degli oggetti per contenere e trasportare i "dati di business" allora è necessario prima creare le classi relative (Application_Model_Guestbook) e poi realizzare delle classi che effettuano il mapping dal modello ad oggetti al modello relazionale del DB, i Mapper appunto.

Quindi la scelta sta tra array e modello a oggetti per i dati di business.

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Risposta chiarissima, grazie!!

Quando è consigliabile la prima soluzione (array) e quando la seconda (mapper)?

Grazie

risposto 6 anni fa
il_dandi
X 0 X

Gli array sono semplici, veloci e pratici da maneggiare ma nascondono quella che sarà la struttura dei dati destinati a contenere. A priori nessuno può dire cosa contiene un array.

Gli oggetti al contrario hanno nella loro stessa struttura (attributi) la documentazione del "dominio applicativo" ovvero delle entità gestite dall'applicazione (utente, prodotto, carrello, ecc..)

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda