![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 9 Dołączył: 20.09.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Mam pytanie odnośnie DAO (Data Access Object). Mam projekt, w którym obecnie korzystam z Doctrine ale może się to zmienić. W późniejszym czasie może zaistnieć sytuacja gdzie będę pobierał dane przez SOAP, json bądź csv. Chciałbym stworzyć warstwę abstrakcji dostępu do danych gdzie w kontrolerach nie będę musiał się zastanawiać czy korzystać z doctrine, json czy csv. W googlach znalazłem tylko to https://github.com/fightmaster/dao. Jak wy radzicie sobie z tym problemem ? Pozdrawiam. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Niestety nie ma zbyt dobrze utartych standardów w tym zakresie, a większość FW/bibliotek/ogólnie kodu w sieci bardzo często utożsamia warstwę biznesową/modelu z ORM-em/bazą danych.
Przygotuj odpowiedni zestaw interfejsów, które w żaden sposób nie są powiązane ze źródłem danych, przykładowo: Konkretna implementacja jest już w pewnym sensie nieistotna. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 1 Dołączył: 26.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
W tym celu powinno używać się klas abstrakcyjnych z sufiksem Model:
Implementacja:
W kontrolerach oraz serwisach oczywiście wymagamy klasy UserModel i nie obchodzi nas skąd gettery biorą dane (IMG:style_emoticons/default/smile.gif) Należy pamiętać, że możemy rozszerzać tylko jedna klasę abstrakcyjną podczas gdy interfejsów można implementować wiele do jednej klasy. Ten post edytował billy0o 23.10.2014, 22:41:35 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 9 Dołączył: 20.09.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wielkie za odpowiedź.
Myślałem, żeby zrobić serwis, który by mi zwracał odpowiedni serwis np UserManager, ArticleManager. W pliku konfiguracyjnym bym mógł ustawić z czego korzystam (doctrine, csv, yml, soap, itp). W kontrolerze mógłbym wywoływać serwis:
W metodzie get klasy DaoManager jako 2 parametr moglibyśmy ustawiać z jakiego źródła pobierać. Jeśli nie został przekazany to default`owo źródło jest takie jak ustawiliśmy w pliku konfiguracyjnym. Czy brzmi to w miarę logicznie ? Pozdrawiam. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 1 Dołączył: 26.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
Brzmi logicznie ale wydaje mi się, że jest to o jeden serwis za dużo. Możesz po prostu zmieniać klasę serwisu poprzez parametr:
Kod parameters: acme.user_menager.class: Acme\ExampleBundle\Doctrine\UserMenager services: acme.user_menager: class: %acme.user_menager.class% arguments: [@service_container] Parametr acme.user_menager.class możesz zmienić w pliku parameters.yml, bądź w klasie Extension parsując config. DI w sf2 pozwala uniknąć właśnie takich konfiguracyjnych obiektów i po to został stworzony. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 428 Pomógł: 77 Dołączył: 10.07.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
A ja bym to zrobił nieco inaczej...
Wątpię abyś chciał modyfikować wywołania swoich metod w każdym miejscu gdzie już istnieją... Pomyślałbym o zastosowaniu adapterów opartych o jeden interface. Przy takim podejściu logika wywołująca metodę getUser() zawsze zwróci usera, nie zależnie który adapter został wybrany. Jak dla mnie to najprostrze i zarazem optymalne gdyż jeżeli zmiana w strukturze danych nastąpi, to modyfikujesz jedno miejsce - dany adapter. Robiłem coś podobnego przy okazji pisania pobierania informacji o użytkowniku logującym się przez Facebook/Linkedin/Google+ etc. Nie zależnie który serwis, zawsze używasz tej samej metody, oczywiście co się dzieje po drodze to już Twoja sprawa. Pozdrawiam |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 20:44 |