quello che faccio:
I miei modelli non sono entità legate al database (quando non sto usando la dottrina), in modo che nessun metodi "record attivo". Un oggetto non sa come recuperare le sue dipendenze (per esempio, un utente può avere n commenti, il mio modello non sa come ottenere commenti).
class User{
private $name;
private $password;
// getter and setters
}
devo servizi che tengono una certa logica di business in grado di recuperare modelli da fornitori, un servizio può avere molti fornitori.
class UserService{
function __construct(IUserProvider $userProvider){
$this->userProvider = $userProvider
}
function getUsers(){
// return an array of user objects
return $this->userProvider->getUsers();
}
}
finalmente ho un provider di dati che sa come richiedere dati dal database, un file di testo, un file JSON, un webservice:
class UserProvider implements IUserProvider{
function __construct(Connection $connection){
$this->connection = $connection;
}
function getUsers(){
return $this->toUsers($this->connection->fetchAssoc("Select * from users"));
}
function toUsers(array $datas){
// convert user records to an array of User
(...)
return $users;
}
}
poi l'interfaccia
interface IUserProvider{
/**@return array an array of User */
function getUsers();
}
se ho bisogno di ottenere un commento utente, il mio servizio di commento sa come recuperare i commenti da un id utente. Quindi per ottenere un utente e i suoi commenti, ho bisogno di 2 richieste al database. uno da UserProvider, l'altro da CommentProvider.
così ho 3 strati:
- il mio livello di applicazione (utenti di visualizzazione, rispondere alle richieste di qualunque cosa ...)
- il mio livello di servizio (che deve lavorare con un'interfaccia a riga di comando e non è consapevole della mia applicazione web, fatta eccezione per la codifica della password che di solito è binded al quadro che uso, e ACL infila forse ...)
- il mio livello di accesso ai dati, che non sa nulla degli altri strati,
l'unico modo in cui i miei livelli comunicano è attraverso i Modelli che passo da un livello all'altro.
E tutte le mie classi sono costruite con un contenitore di iniezione dipendente, quindi il cablaggio non è un problema.
Ecco un esempio di un app che ho fatto, è open source: https://github.com/Mparaiso/silex-bookmarkly
Ogni pensiero di benvenuto.
+1 bella domanda :) –
+1 anche per bella domanda ... –