Il progetto su cui sto lavorando da circa un anno è stato usato per creare una nuova connessione mysqli al database ogni volta che c'era una query sul database. Per risolvere rapidamente questo problema nei punti in cui questa strategia ha avuto seri problemi di prestazioni, ho creato una variabile globale $connection
che fornisce un'istanza PDO.
Tuttavia, abbiamo anche altri dati memorizzati in $SESSION
che è pesantemente utilizzato in quasi tutte le query SQL. Pertanto chiamiamo qualcosa come $SESSION['xyz']->getLogin()->getUUID()
nella maggior parte dei nostri metodi che contengono una query SQL.
Quindi, dopo circa un anno di consegna del codice riutilizzabile al progetto, in modo che il mio team riconosca quanto sia facile e meno snervante implementare nuove funzionalità, alla fine li ho convinti a fare il passo successivo e refactoring il nostro codice php ad alcuni MVC unificati -Codice e inizia anche ad usare le interfacce (hurra!) E alcuni schemi di progettazione aggiuntivi. (Quindi, finalmente potrò iniziare a utilizzare PHPUnit in modo efficace)
Quindi ho deciso di abbandonare il singleton per la nostra connessione al database e passare all'input delle dipendenze e aggiungere anche una classe base astratta che tutte le nostre classi modello dovranno ereditare (esiste anche una classe base astratta per tutti i controller). Poiché PHP consente solo un costruttore, sono passato a metodi statici che restituiscono una nuova istanza della sua classe e eseguiamo anche alcune operazioni iniziali sull'istanza (come User:createByUUID( string $uuid )
e User::createByEmail( string $email )
che caricano entrambi i dati utente dal database.)
Ora, alcuni dati come il pdo e l'UUID non cambieranno durante una richiesta. Quindi mi piacerebbe iniettarli solo una volta invece di iniettare questi dati in ogni istanza. La mia idea era di avere un metodo finale statico pubblico addStaticDepenendcy( ... )
e anche getStaticDependency( ... )
alla classe base astratta, che memorizza la dipendenza in una variabile statica in modo che le dipendenze possano essere iniettate in tutte le classi con un singolo comando nel momento in cui vengono create.
Per tutte le altre dipendenze che potrebbero venire aggiungerò del addDependency()
e il metodo getDependency()
per gestire le dipendenze individuali.
Ho anche alcuni dati semplici (come l'UUID), che è necessario in (quasi) tutte le classi, quindi lo gestirò nello stesso modo in cui gestisco le dipendenze anche se sono solo alcuni numeri interi o stringhe.
Questa è una "buona pratica" per gestire tutte le dipendenze? Quali problemi potrei incontrare con questa strategia? Esistono modi più intelligenti per farlo?