Was ich tue:
Meine Modelle sind nicht mit der Datenbank verknüpft Entities (wenn ich verwende Lehre nicht), so dass keine „aktive Datensatz“ Methoden. Ein Objekt weiß nicht, wie es seine Abhängigkeiten abrufen soll (zum Beispiel kann ein Benutzer n Kommentare haben, mein Modell weiß nicht, wie man Kommentare bekommt).
Ich habe Dienstleistungen, die einige Geschäftslogik halten, die Modelle von Anbietern holen können, ein Service kann viele Anbieter haben.
class UserService{
function __construct(IUserProvider $userProvider){
$this->userProvider = $userProvider
}
function getUsers(){
// return an array of user objects
return $this->userProvider->getUsers();
}
}
schließlich habe ich einen Datenprovider, der weiß, wie Daten aus der Datenbank zu beantragen, eine Textdatei, eine JSON-Datei, eine 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;
}
}
dann die Schnittstelle
interface IUserProvider{
/**@return array an array of User */
function getUsers();
}
Wenn ich einen Benutzerkommentar abrufen muss, weiß mein Kommentardienst, wie Kommentare von einer Benutzer-ID abgerufen werden. Um einen Benutzer und seine Kommentare zu erhalten, brauche ich zwei Anfragen an die Datenbank. eine aus dem UserProvider, die andere aus dem CommentProvider.
so habe ich 3 Schichten:
- meine Anwendungsschicht (Display Benutzer, reagieren auf Anfragen was auch immer ...)
- meine Service-Layer (die mit einer Kommandozeilen-Schnittstelle zu arbeiten und ist nicht bewusst, meine Web-Anwendung, mit Ausnahme von Passwort-Codierung, die in der Regel auf den Rahmen binded i verwenden und ACL stopft vielleicht ...)
- meine Datenzugriffsschicht, die nichts über die anderen Schichten kennt,
Die einzige Art und Weise, wie meine Schichten kommunizieren, ist durch Modelle, die ich von Schicht zu Schicht durchlasse.
Und alle meine Klassen sind mit einem Dependency-Injektion Container gebaut, so dass die Verkabelung kein Problem ist.
Hier ein exemple einer App ist i gemacht, es ist Open-Source-: https://github.com/Mparaiso/silex-bookmarkly
Irgendwelche Gedanken willkommen.
+1 nette Frage :) –
+1 für schöne Frage ... –