Nel mio progetto ho specificato 5 sottolivelli per il mio DBAL:
- Database Layer (il database stesso)
- Database Connection Layer (\ PDO e una classe che gestisce le connessioni al database)
- Database Request Layer (classi che interrogano effettivamente il database)
- Livello del modello di database (tutte le classi che rappresentano 1 tabella di database ciascuna e una classe di fabbrica che consente di accedere facilmente a tutte le classi del modello)
- Livello del modello (classi che combinano diverse classi di modelli di database per farle funzionare insieme)
Ora ho impostato la restrizione che ogni livello DOVREBBE avere accesso solo alle classi del proprio livello o delle classi direttamente sotto (il Livello 4 PU access accedere ai Layer 4 e 3 ma NON DEVE accedere al Livello 5 e NON DOVREBBE accedere ai livelli 1 e 2) . Ma quando si tratta di un generatore di query (ho deciso di utilizzare il link in quanto non richiede un connessione al database) Mi chiedo a quale livello questo dovrebbe essere assegnato e dove dovrei usarlo.
Chiaramente la query risultante dovrebbe essere passata al livello 3, quindi il generatore di query dovrebbe essere 3 o 4, ma nella maggior parte dei casi sembra che sia più probabile che tu debba creare una query nel livello 5 quando voglio creare un po 'di livello 4 oggetti.
Attualmente il mio codice che usa il generatore di query è simile a questo (nel livello 5):
$builder = $this->entityFactory->getDbRequest()->getQueryBuilder();
// build the $query
$entity = $this->entityFactory->makeEntityByQuery( Entityname::class, $query);
Così attualmente ho localizzato il QueryBuilder nel Layer 3 ma questo mi costringe ad accedere al Layer 3 dal Livello 5 che vorrei evitare. Potrei spostarlo sul layer 4, ma poi dovrei renderlo dipendente dalla maggior parte delle Classi del Model Layer o renderlo accessibile direttamente da EntityFactory. Ma ancora una volta EntityFactory avrebbe 2 responsabilità, che violano SRP.
In quale livello utilizzi o vuoi utilizzare il Query Builder?