Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]Dynamic database connection
Forum PHP.pl > Forum > PHP > Frameworki
Lirdoner
Cześć, mam taki problem, że udostępniam aplikację napisaną w symfony pod różnymi domenami. Muszę teraz tą aplikację przerobić tak aby w zależności od domeny łączyło z odpowiednią bazą danych.
Od razu napiszę, że http://symfony.com/doc/current/doctrine/mu...y_managers.html odpada. Nie chcę dodawać 100 połączeń w config.yml

Pomysł mój jest taki aby istniała baza "matka" która będzie zawierała połączenia do pozostałych baz. Czyli na samym początku z bazy matki pobieram dane do połączenia a potem zastępuje to obecne połączenie nowym. Pomysł chyba dobry ale łatwo napisać a trudniej zrobić wink.gif Macie może jakieś pomysły jak to ogarnąć?
Pyton_000

Ad problemu. Ja kiedyś pisałem coś takiego tyle że dane do łączenia były trzymane w plikach. Używałem coś bardzo podobnego do tego: https://stackoverflow.com/questions/1510873...585284#24585284
Pilsener
Tak czy inaczej będziesz musiał zdefiniować:
- n połączeń do baz (doctrine/dbal/connections)
- n entity managerów (doctrine/orm/entity_managers)
Do tego potrzebny będzie co najmniej jeden serwis do rozpoznawania domen i kolejny do wyboru połączenia i entity managera.
Poza tym kawałek kodu, który to wszystko połączy w jedno.

Bo skoro używasz różnych baz, to pewnie nie dlatego, że są one identyczne a przecież baza musi pasować do encji, inaczej zaraz będziesz miał sytuację, że w bazie jest tabela a encji nie ma lub odwrotnie.

Cytat
Używałem coś bardzo podobnego do tego: https://stackoverflow.com/questions/1510873...585284#24585284

Cytat
kiedyś
połączenie do bazy było nawiązywane dość późno, od wersji (chyba 3) to się zmieniło i tego typu proteza może powodować liczne problemy z wydajnością, meta danymi bazy, cache, debugerem, działaniem w trybie klienta i wiele innych.
Dużo lepiej jest przesłonić odpowiednią metodę w bootstrapie aplikacji, dobrym momentem wydaje się inicjalizacja kontenera - ale lepiej przed tworzeniem cache'u.

Znalazłem też w Doctrine coś takiego:
https://www.doctrine-project.org/projects/d...l#wrapper-class
Tylko nigdy tego nie używałem i nie wiem nawet, czy da się to jakoś połączyć z entity managerem - może i się da i tu widzę pole do popisu.


I opieram się o Symfony3, nie wiem jak to jest w Symfony4, prawdopodobnie podobnie a może dodali odpowiedni event (chociaż go nie widzę).
Kombinuj i daj znać, czy coś się udało.
LowiczakPL
Cytat(Lirdoner @ 10.05.2018, 19:51:20 ) *
Cześć, mam taki problem, że udostępniam aplikację napisaną w symfony pod różnymi domenami. Muszę teraz tą aplikację przerobić tak aby w zależności od domeny łączyło z odpowiednią bazą danych...


Apropo 100 połączeć w config.yml to mam podobnie z tym że jest to w Laravelu aplikacja korzysta z różnych baz danych.

Rozwiązane mam to tak że nazwa konfiguracji jest zdefiniowana w konfiguracji VHOSTa dla domeny, a Laravel odczytuje sobie konfigurację i ciągnie .env z odpowiednim połączeniem dla bazy i innymi stałymi.

Ale mam zrobione ponad 300 plików, na Twoim miejscu z pomysłu z bazą danych do trzymania konfiguracji bym zrezygnował.

Lirdoner
Dzięki za odpowiedzi. Konfiguracja oparta na vhostach jest dla mnie idealna. Wszystko działa sprawnie ale jest jeden problem. Wykonująć np php bin/console cache:clear dostaję komunikat Environment variable not found: "DATABASE_HOST".
Co z tym można zrobić?
Pilsener
To normalne, aplikacja działająca w trybie klienta nie ma dostępu do kontekstu serwera (bo niby skąd?)

Cytat
Co z tym można zrobić?


Ustawiać zmienne przed wykonaniem komendy php coś tam.
Np. w win można to zrobić w konsoli:

Kod
set DATABASE_HOST=qwerty


Lub dodając odpowiednie zmienne bezpośrednio do systemu (edycja zmiennych środowiskowych)

Możesz też rozpoznawać tryb pracy aplikacji i napisać ją tak, aby w trybie klienta nie potrzebowała zmiennych środowiskowych.
Pyton_000
Napisz sobie jakiegoś prostego basha który właśnie ustawi ci env po podaniu domeny. jeśli vhosty masz jakoś standaryzowane wg. nazwy to możesz jes sobie z pliku wyciąnąć. chyba że masz jakieś pliki env. dl vhostó dołączane
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.