[Symfony]Dynamic database connection |
[Symfony]Dynamic database connection |
10.05.2018, 18:51:20
Post
#1
|
|
Grupa: Zarejestrowani Postów: 500 Pomógł: 1 Dołączył: 29.09.2009 Ostrzeżenie: (0%) |
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ć Macie może jakieś pomysły jak to ogarnąć? |
|
|
10.05.2018, 20:13:19
Post
#2
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
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 Ten post edytował Pyton_000 10.05.2018, 20:13:34 |
|
|
10.05.2018, 21:51:15
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
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. |
|
|
11.05.2018, 09:41:04
Post
#4
|
|
Grupa: Zarejestrowani Postów: 531 Pomógł: 55 Dołączył: 3.01.2016 Skąd: Łowicz Ostrzeżenie: (0%) |
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ł. Ten post edytował LowiczakPL 11.05.2018, 13:00:01 -------------------- Szukam zleceń Symfony, Laravel, Back-End, Front-End, PHP, MySQL ...
|
|
|
12.05.2018, 14:44:26
Post
#5
|
|
Grupa: Zarejestrowani Postów: 500 Pomógł: 1 Dołączył: 29.09.2009 Ostrzeżenie: (0%) |
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ć? |
|
|
12.05.2018, 21:29:09
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
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. |
|
|
13.05.2018, 07:10:17
Post
#7
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
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
|
|
|
Wersja Lo-Fi | Aktualny czas: 24.04.2024 - 06:37 |