Ho letto su più framework PHP, in particolare su Zend Framework, ma mi sto confondendo sul modo corretto di andare avanti.Il modello DataMapper interrompe MVC?
Zend Framework non utilizza ActiveRecords ma utilizza il modello Table Data Gateway e Row Data Gateway e utilizza un DataMapper per mappare il contenuto del Row Data Gateway sul modello, poiché ActiveRecord si interrompe quando i modelli non lo fanno avere un mapping 1: 1 nelle tabelle del database. C'è un example of this nella guida rapida di Zend.
Per me, il loro esempio sembra molto gonfio con un sacco di getter e setter dappertutto. Mi sono imbattuto in vari post del blog su Domain Driven Design sostenendo che l'utilizzo di così tanti getter e setter è una cattiva pratica perché espone all'esterno tutti i dati del modello interno, quindi non ha alcun vantaggio sugli attributi pubblici. Here is one example.
La mia domanda: se rimuovi quei getter e setter, come renderesti le tue visualizzazioni? Ad un certo punto i dati devono colpire la vista in modo da poter mostrare qualcosa all'utente. Seguendo il consiglio DDD sembra rompere la separazione tra M e V in MVC. Seguendo l'esempio di MVC e Zend sembra di rompere DDD e mi lascia scrivere un sacco di getters, setter e DataMappers per tutti i miei modelli. A parte il fatto di essere molto impegnato, sembra anche violare DRY.
Vorrei davvero apprezzare alcuni (collegamenti a) buoni esempi o ulteriori informazioni su come tutto si combina perfettamente. Sto cercando di migliorare le mie capacità di architetto e progettazione qui.
Grazie. Quell'articolo Devlicious è una buona lettura. Ho intenzione di leggere anche il resto della serie. –
Questa è una buona risposta e vorrei aggiungere che non c'è nulla di sbagliato nei getter, setter. In realtà, averli è un ottimo modo per aggiungere logica di validazione. Rendere pubbliche le proprietà è veloce e sporco e va bene durante la prototipazione, ma non è una soluzione a lungo termine. Supponiamo di volere cambiare il nome di una proprietà. Se lo fai, ogni pezzo di codice che accede a quella proprietà deve cambiare. Se si utilizza un nome generico per il metodo accessor, non è necessario modificare il codice client. Inoltre, Doctrine è una soluzione molto più ricca di Zend DB. Non consiglierei Doctrine1, ma prova Doctrine2. –