Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Trzy pytania o spojnosc
q.michal
post 22.05.2017, 08:18:45
Post #1





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


Czesc wszystkim.


Mam 2 pytanai dotyczace spojnosci kodu i parametrow:

Otoz pisze klase do obslugi logow, ktora ma pozwalac na zapisywanie ich w plikach, bazie danych czy przesylanie do sysloga, w zaleznosci od wybranego poziomu logowania. Dzieki temu bledy moga trafic do innego miejsca niz ostrzezenia. W oby przypadkach moze to byc rozna baza danych, badz rozne pliki.

Tak wiec, pierwsze klaska w ktorej bede zapisywal logi do plikow musi wiedziec do jakiego pliku je zapisac, natomiast klasa logujaca zdarzenia w bazie musi wiedziec w jakiej bazie i jakiej tabeli sa przechowywane. To sprawia ze parametry konfiguracyjne beda nie tylko rozne, ale roznic bedzie sie takze ich ilosc. (plik - nazwa pliku; DB - baza, tabela). Chcialem aby w obu przypadkach, opcje byly przekazywane w formie tablicy do konstruktora:
  1. function __construct($config = []);

I nastepnie szukac w $config['filename'], $config['db'], $config['table'] itp.

Wywolanie konstruktora byloby wowczas takie samo. Pytanie nr 1 brzmi: czy to dobre podejscie?
W sytuacji gdyby np sciezka do pliku nie zostala podana, chcialbym rzucic wyjatek mowiacy o tym, ze do konstruktora zostala przekazana nieprawidlowa konfiguracja.

Tutaj jednak rodzi sie drugie pytanie: Otoz wyobrazam sobie w przyszlosci jakis panel administracyjny w ktorym bedzie mozna wybrac ze system ma logowac bledy do pliku lub bazy i po wybraniu odpowiedniej opcji, uzytkownik dostanie odpowiednie pola do wyboru. Skad aplikacja ma wiedziec ze 1 konstruktor czeka na $config['filename'] a drugi na $config['db'] i $config['table'] ?

Ostatnie pytanie brzmi: Jak najlepiej zapewnic takiej klasie dostep do bazy danych? Powinna ona w parametrze $config['db'] dostac DSNa i nawiazac polaczenie do bazy? A moze skorzystac z tego samego polaczenia co cala aplikacja? Co jesli to beda 2 rozne bazy? Moze powinien pierw sprawdzac czy w $config['db'] jest obiekt klasy Database i wtedy operowac na nim, a jesli nie, sprawdzic inna opcje - przykladowo $config['dsn'] i nawiazac nowe polaczenie?
Go to the top of the page
+Quote Post
Pyton_000
post 22.05.2017, 08:25:33
Post #2





Grupa: Zarejestrowani
Postów: 7 821
Pomógł: 1375
Dołączył: 26.10.2005

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


Podstawowe pytanie. Monolog Ci nie wystarczy? Bo w sumie robi dokładnie to czego potrzebujesz.
Go to the top of the page
+Quote Post
q.michal
post 22.05.2017, 08:45:36
Post #3





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


Wole napisac cos swojego, poza tym te same pytania pojawia sie pewnie takze pozniej, przy implementowaniu innych funkcjonalnosci.
Go to the top of the page
+Quote Post
Pyton_000
post 22.05.2017, 09:25:54
Post #4





Grupa: Zarejestrowani
Postów: 7 821
Pomógł: 1375
Dołączył: 26.10.2005

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


Ja nie neguję pisania swoich rozwiązań ale czy warto w tym przypadku akurat zawracać sobie gitarę robieniem czegoś co jest i działa świetnie a do tego ma multum opcji konfiguracji?

Np. rozdzielenie na wiele BD sprowadza się do dodania 2 lub więcej wrapperów i określenie miejsca wraz z poziomem błędu jaki ma łapać.
Go to the top of the page
+Quote Post
q.michal
post 22.05.2017, 09:31:53
Post #5





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


Byc moze masz racje, ale jak juz nie raz pisalem, takie podejscie ma tez swoj aspekt edukacyjny. A nawet gdy wezme gotowego loggera, to taki sam alb o zblizony problem moze pojawic sie rowniez na pozniejszym etapie. Chcialbym pominac aspekt oplacalnosci i skupic sie na konkretnym przedstawionym problemie. nawet jesli zdecyduje sie skorzystac z gotowca, chetnie poznam rozwiazanie.
Go to the top of the page
+Quote Post
Pyton_000
post 22.05.2017, 09:41:10
Post #6





Grupa: Zarejestrowani
Postów: 7 821
Pomógł: 1375
Dołączył: 26.10.2005

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


No dobra... No to tak, Piszesz sobie wpierw klasy Wrappera czyli klasę per metodę zapisu np. file log, syslog, DB z interface np. LogWrapperInterface.
Potem piszesz sobie główną klasę do której za pomocą metody np. addWrapper() będziesz dodawał obiekty klasy tworząc tym samym zbiór kolekcji. (dla każego wrappera podajesz oddzielnie konfiguracje)

Potem wywołując metodę CustomLogger->info('aonsfdasdf');
lecisz po każdym elemencie kolekcji (wrapperach) i odpalasz na nich metodę info() odpowiednio zapisując gdzie trzeba.

Tak mega skrótowo.
Go to the top of the page
+Quote Post
q.michal
post 22.05.2017, 09:46:56
Post #7





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


Dzieki, ale to akurat wiedzialem. Moje pytania byly zupelnie inne wink.gif
Go to the top of the page
+Quote Post
nospor
post 22.05.2017, 09:48:22
Post #8





Grupa: Moderatorzy
Postów: 34 858
Pomógł: 5801
Dołączył: 27.12.2004




@q.michal musisz wziasc poprawke na starych ludzi. W pewnym wieku niedoslysza i niedowidza (wiem z wlasnego doswiadczenia wink.gif ). Takze dobrze, ze jestes wyrozumialy dla Pytona. Za ktoryms razem zalapie wink.gif

edit down:
@Pyton co tam piszesz? Daj wieksza czcionke... troche niedowidze... wink.gif


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Pyton_000
post 22.05.2017, 09:51:26
Post #9





Grupa: Zarejestrowani
Postów: 7 821
Pomógł: 1375
Dołączył: 26.10.2005

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


1. array jest ok.
2. Z dokumentacji. Skoro ktoś ma sam sobie podawać dane to musisz mu pokazać co ma podać. Sam wrapper powinien sobie jakoś zwalidować config.
3. Przekazujesz obiekt PDO (tudzież inny wrapper i pod niego piszesz handler)

Możesz też stworzyć klasy np. DbLoggerConfig, FileLoggerConfig itd. i tam podawać w konstruktorze odpowiednie informacji.

@nospor wredna bestia tongue.gif

Ten post edytował Pyton_000 22.05.2017, 09:51:53
Go to the top of the page
+Quote Post
q.michal
post 22.05.2017, 10:04:35
Post #10





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


2. Co w sytuacji, kiedy budujac panel admina bede chcial, aby uzytkownik mogl podac wszystkie dane? Aby odpowiednie input boxy mu sie pojawily po wybraniu pozycji z drop-listy? Jesli dobrze rozumiem, trzeba bedzie wszystko oskryptowac? Moglbym zaimplementowac metode customLogger->listWrappers(); ktora zwroci liste wszystkich obslugiwanych backendow i dodac wszystkie elementy tablicy do drop-listy, ale nie bede mial niezbednych parametrow.

Z jednej strony mozna by zrobic switcha i dopisac odpowiednie parametry (wg. dokumentacji), z 2 strony trzeba bedzie to robic za kazdym razem kiedy dodany zostanie nowy backend.
Go to the top of the page
+Quote Post
Pyton_000
post 22.05.2017, 11:26:07
Post #11





Grupa: Zarejestrowani
Postów: 7 821
Pomógł: 1375
Dołączył: 26.10.2005

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


Jak często będziesz dodawał nowe wrappery wink.gif Aż tak dużo danych nie ma. Zawsze możesz per Wrapper dodać metodę getParamList() która zwróci Ci nazwę parametru, type, ew. jeszcze przykład. No i tyle. Potem foreach sobie lecisz po liście wrapperów, odpalasz metodkę i wrzucasz odpowiednie pola.
Go to the top of the page
+Quote Post
q.michal
post 22.05.2017, 16:10:30
Post #12





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


Dzieki za rozwianie watpliwosci.
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: 10.12.2019 - 14:23