Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony]Dynamic database connection
Lirdoner
post 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ć wink.gif Macie może jakieś pomysły jak to ogarnąć?
Go to the top of the page
+Quote Post
Pyton_000
post 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
Go to the top of the page
+Quote Post
Pilsener
post 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.
Go to the top of the page
+Quote Post
LowiczakPL
post 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%)
-----


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ł.



Ten post edytował LowiczakPL 11.05.2018, 13:00:01


--------------------
Szukam zleceń Symfony, Laravel, Back-End, Front-End, PHP, MySQL ...
Go to the top of the page
+Quote Post
Lirdoner
post 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ć?
Go to the top of the page
+Quote Post
Pilsener
post 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.
Go to the top of the page
+Quote Post
Pyton_000
post 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
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 20.04.2024 - 00:51