Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][Symfony2][SF2][SF3] Dynamiv DB Connection
Pyton_000
post
Post #1





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Co potrzebuję.

1 domyślne połączenie które musi być nawiązanie z BD (dane pobierane z parameters.yml)
Tam pobieram niezbędne dane które później muszą być zapisane np. w sesii

2 połączenie które ma być nawiązywane (może być zastępowane poprzednie).
Dane będą pobierane z plików konfiguracyjnych na podstawie adresu URL.

Czyli w url mam: http://domain.com/conn1/....

Parametr "conn1" będzie zawsze obecny w URL, bo na jego podstawie będę się przełączał przez BD.

Jak? Człowiek dostał S3 do nauki i takie problemy (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
ohm
post
Post #2





Grupa: Zarejestrowani
Postów: 623
Pomógł: 144
Dołączył: 22.12.2010

Ostrzeżenie: (0%)
-----


Bardzo prosto i przyjemnie
https://symfony.com/doc/current/cookbook/do...y_managers.html + jakiś listener wybierający odpowiednie połączenie.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #3





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Ahh kurcze, pod latarnią najciemniej (IMG:style_emoticons/default/biggrin.gif)

A możesz naprowadzić na jakieś rozwiązanie ? Symfony to jeszcze czarna magia (IMG:style_emoticons/default/smile.gif)
Pomyślałem nad nadpisaniem getManager() ale to nie jest chyba zbyt dobry pomysł. Choć może stworzenie swojego wrappera na doctrine do pobierania managera to nie głupi pomysł.

PS. A czy przypadkiem nie będzie się pluł o brakujące properties '%database_driver2%' itd? bo chyba tak miałem jak próbowałem różnych rozwiązań z sieci.
Go to the top of the page
+Quote Post
ohm
post
Post #4





Grupa: Zarejestrowani
Postów: 623
Pomógł: 144
Dołączył: 22.12.2010

Ostrzeżenie: (0%)
-----


Chodziło mi o rozwiązanie mniej więcej coś w tym stylu
https://stackoverflow.com/questions/1510873...585284#24585284
Wyłapujesz requesta, zmieniasz połączenie na jakie chcesz i puszczasz dalej (IMG:style_emoticons/default/smile.gif)

Co do nadpisywania getManagera, to raczej niebardzo, ale parametry możesz ewentualnie zmieniać (chociaż to też może się to zemścić po czasie (IMG:style_emoticons/default/wink.gif) ), ewentualni tak jak piszesz, że jakiś wrapper/manager połączeń też powinien się sprawdzić.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Oh yeaaa (IMG:style_emoticons/default/biggrin.gif)

To mi się sprawdzi idealnie w sumie.
Chociaż tak na prawdę to nawet nie potrzebuję 2 połączeń, a jedynie podmianę domyślnego na inne po pobraniu niezbędnych danych z 1-szego połączenia.

Tak więc bajera (IMG:style_emoticons/default/smile.gif) Dzięki (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
uirapuru
post
Post #6





Grupa: Zarejestrowani
Postów: 182
Pomógł: 9
Dołączył: 30.04.2005

Ostrzeżenie: (0%)
-----


Poczytaj o ConnectionWrapper w Doctrine. napisałem nawet do tego symfonowego bundla, plus mogę dostarczyć nieco kodu poglądowego (IMG:style_emoticons/default/smile.gif) Daj znać. Ta technika ("przełączalna baza") to multitenant database sie ogolnie nazywa chyba. w swoim projekcie mam jedną podstawową bazę dla wszystkich subdomen projektu oraz po jednej bazie na każdą subdomene. dwa połączenia, dwa entity menagery, dużo baz danych (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Pyton_000
post
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Bardzo chętnie zobaczyłbym Twoje rozwiązanie.
Go to the top of the page
+Quote Post
uirapuru
post
Post #8





Grupa: Zarejestrowani
Postów: 182
Pomógł: 9
Dołączył: 30.04.2005

Ostrzeżenie: (0%)
-----


dwa linki:

https://github.com/gyman/app
https://github.com/UirapuruDende/MultidatabaseBundle

nie mam zbyt wiele czasu, wiec naprędce napisze tylko; po pierwsze to wszystko sie nadal tworzy, jest brzydkie i uzywane tylko przeze mnie (IMG:style_emoticons/default/smile.gif)

multidatabase bundle dostarcza kilka rzeczy:
1) klasę connection wrapper, której używam w configu doctrine w gyman/app.
2) dostarcza też listener dla "command" - są commandy doctrinowe (schema, fixtury), które musisz wykonać na pewnej konkretnej bazie - listener do wskazanych commandów dodaje parametr, według którego możesz wyłapać sobie interesujacą Cię baze i przeprowadzić na niej operacje. jesli tego nie zrobisz - zadziała jak zwykle na podstawowej. potrzebne do tego rzeczy również w config.yml w gyman/app siedzą

bundle wymaga by dostarczyc mu serwis, który dostarczy tzw. Tenanta. W moim przypadku (w gyman/app) jest request listener, który odczytuje subdomene i na jej podstawie tworzy tenanta i przekazuje go do multidatabase bundle, który przełącza na podstawie tych danych connection. Nie widze problemu, by napisać własną klasę, która te dane pobierze np. z encji usera, czy innego miejsca.

generalnie zasada działania jest prosta. pozostało mi otestować, uporządkować, odokumentować i dodać może coś co pozwoli hurtowo przelecieć wszystkie bazy tą samą operacją (np. migracją).

do testów też warto mieć to rozwiązane tak, by test sie uruchamiał na odpowiednich ustawieniach (tak w moim wypadku jest, testy gyman/app lecą na "drugim" połączeniu zafiksowanym w config_test.yml na sqlite).

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 12:17