co zrobić:
Moje modele nie są Podmioty związane z bazy danych (gdy nie używam doktryny), więc nie ma metody „Active Record”. Obiekt nie wie, jak pobrać jego zależności (na przykład użytkownik może mieć n komentarzy, mój model nie wie, jak uzyskać komentarze).
class User{
private $name;
private $password;
// getter and setters
}
mam usługi, które posiadają pewną logikę biznesową, która może pobierać modele od dostawców, usługa może mieć wielu dostawców.
class UserService{
function __construct(IUserProvider $userProvider){
$this->userProvider = $userProvider
}
function getUsers(){
// return an array of user objects
return $this->userProvider->getUsers();
}
}
wreszcie mam dostawcy danych, który wie, jak zwrócić dane teleadresowe z bazy danych, plik tekstowy, plik JSON usługa:
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;
}
}
następnie interfejs
interface IUserProvider{
/**@return array an array of User */
function getUsers();
}
jeśli potrzebuję uzyskać komentarze użytkownika, to moja usługa komentarzy wie, w jaki sposób pobrać komentarze od użytkownika. Aby uzyskać użytkownika i jego komentarze, potrzebuję 2 żądań do bazy danych. jeden z UserProvider, drugi z CommentProvider.
tak mam 3 warstw:
- moje warstwy aplikacji (użytkownicy wyświetlacz, odpowiadać na żądania cokolwiek ...)
- mój warstwa serwis (który ma pracować z interfejsem wiersza poleceń i nie jest świadomy mojej aplikacji internetowych, z wyjątkiem kodowania haseł, które zwykle zbindowanych ram używam i ACL spożywcze może ...)
- mój warstwy dostępu do danych, które nie wie nic na temat innych warstw,
Jedynym sposobem, w jaki komunikują się moje warstwy, jest przechodzenie modeli z warstwy na warstwę.
Wszystkie moje klasy są zbudowane za pomocą kontenera wtryskowego zależności, więc okablowanie nie stanowi problemu.
Oto exemple z aplikacji zrobiłem, to otwarte źródło: https://github.com/Mparaiso/silex-bookmarkly
Wszelkie myśli mile widziane.
+1 miłe pytanie :) –
+1 też za miłe pytanie ... –