![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 859 Pomógł: 177 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Jak według was powinno pobierać się konfuguracje z plik php? A może lepsze do tego jest file.ini ?
U mnie obecnie wygląda to tak:
I w pliku php:
|
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Przejrzyj CakePHP, mają niezłe rozwiązanie np odczytujesz wartości przez
Co odpowiada tablicy Cytat array('mysql' => array('login'=>'test')) Nie potrzebnie tworzysz zmienną $config. file.php
I co jak będę chciał wczytać inny plik? Ten post edytował !*! 25.02.2013, 20:17:04 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 350 Pomógł: 31 Dołączył: 23.05.2010 Ostrzeżenie: (0%) ![]() ![]() |
Wraz z każdym wywołaniem "get' (czyli pobrania danej konfiguracji) wczytujesz plik konfiguracyjny (Config/config.php) zmień require na require_once.
Najlepiej moim zdaniem byłoby stworzenie funkcji "instance" lub "init" (jak kto woli) i w tej funkcji byłoby wczytywanie konfiguracji (tj: require_once + zapis do zmiennej publicznej $con) a w funkcji statycznej "get" po prostu zastosować zapis:
Oczywiście funkcja instance/init musiałaby się uruchamiać wraz z aplikacja. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Nie powinieneś stosować sztywnego odczytu z INI/XML/YAML. Raczej powinieneś skorzystać ze "sterownika", który wczyta dane z dowolnego formatu.
2. Dlaczego korzystasz z metod/klasy statycznej, skoro możesz, i zapewne będziesz miał, wiele różnych plików konfiguracyjnych? 3. Odwoływanie się wewnątrz jednego obiektu, do jakiegoś globalnego Config::get('xxx') to paskudna praktyka, która prędzej czy później zemści się. |
|
|
![]()
Post
#5
|
|
Grupa: Moderatorzy Postów: 4 069 Pomógł: 497 Dołączył: 11.05.2007 Skąd: Warszawa ![]() |
Crozin, kolega ma problem z poprawnym napisaniem metody ładowania tablicy z pliku a ty mu każesz pisać sterowniki do ini/xml/yaml?
Proponował bym aby aras najpierw pogrzebał w kodzie innych fw, i dopiero wtedy brał się za swój jeśli nadal będzie czuł taką potrzebę. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Dlaczego korzystasz z metod/klasy statycznej, skoro możesz, i zapewne będziesz miał, wiele różnych plików konfiguracyjnych? Jedno nie wyklucza drugiego. 3. Odwoływanie się wewnątrz jednego obiektu, do jakiegoś globalnego Config::get('xxx') to paskudna praktyka, która prędzej czy później zemści się. W zasadzie to dlaczego? Globalny dostęp, jako singleton ma sens w przypadku plików konfiguracyjnych i jest dość przejrzysty. Ten post edytował !*! 26.02.2013, 09:16:14 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
!*! przyznał bym ci rację gdybyś zamienił "plików konfiguracyjnych" na "plik konfiguracyjny" - mała acz znacząca różnica.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 859 Pomógł: 177 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wszystkim za odpowiedzi. Zamierzam korzystać tylko z plików conf: *.php lub .ini . Nie chcę XML, YAML itd bo to mi do tego nie potrzebne. O co chodzi z tym:
Cytat Odwoływanie się wewnątrz jednego obiektu, do jakiegoś globalnego Config::get('xxx') to paskudna praktyka, która prędzej czy później zemści się. Jak mam to inaczej rozwiązać? |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Np. rejestrując obiekt(y) (google -> registry pattern php)
edit: ściągnij sobie Zenda 1.xx i zobacz jak wygląda wgrywanie konfigów a co ważniejsze w jaki sposób, możesz nimi zarządzać Ten post edytował CuteOne 26.02.2013, 11:12:45 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Pewnie chodziło mu o coś w stylu:
Ale dlaczego to niby jest takie złe? Może często tego nie używam, ale jak już to zawsze znacznie ułatwiało niektóre sprawy zamiast je utrudniać, np. właśnie przy Config, Lang itp. Możliwe, że taki wzorzec projektowy ma już jakąś nazwę, ale sam go nazwałem Globalizator (IMG:style_emoticons/default/tongue.gif) // EDIT Jakieś argumenty mile widziane. Ten post edytował pyro 26.02.2013, 11:12:52 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Jasio wchodzi do sklepu aby kupić bułkę(main_config.ini), chleb(lang_config.ini) i 4l mleka(local_lang.ini), niestety w torbie(Singleton) Jasia jest miejsce tylko na jedną rzecz - co teraz pocznie biedny Jaś?
Użyje wzorca z mojego poprzedniego postu (IMG:style_emoticons/default/smile.gif) Ten post edytował CuteOne 26.02.2013, 11:19:57 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Dlatego Config::get() powinien pobierać dane z tablicy, a Config::load() ładować zawarotść plików do tablicy głównej (patrz cakephp).
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Jasio wchodzi do sklepu aby kupić bułkę(main_config.ini), chleb(lang_config.ini) i 4l mleka(local_lang.ini), niestety w torbie(Singleton) Jasia jest miejsce tylko na jedną rzecz - co teraz pocznie biedny Jaś?
// EDIT @!*! mnie wyprzedził. Ten post edytował pyro 26.02.2013, 11:26:57 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
mysql.ini
mssql.ini
W akcji add() użyję mysql.ini po czym odpalam akcję add2() gdzie używam mssql.ini, następnie odpalam akcję add3() gdzie ponownie używam mysql.ini - cio wtedy? ps. nie znam CakePHP ale dla mnie (tak na logikę) ładowanie 10 plików do jednego obiektu to lekkie przegięcie |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
W akcji add() użyję mysql.ini po czym odpalam akcję add2() gdzie używam mssql.ini, następnie odpalam akcję add3() gdzie ponownie używam mysql.ini - cio wtedy? Nic, bo mysql.ini już siedzi w tablicy dodany przez Config::load() (IMG:style_emoticons/default/wink.gif) a skoro jest kilka mysql.ini to ścieżki się nie zgadzają i powinien być inny identyfikator. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
To mozna zastosować rozwiązanie, ktore podałem powyżej i ładujesz tylko to co chcesz i w prosty sposób się do tego odwołujesz z dowolnego miejsca.
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Crozin, kolega ma problem z poprawnym napisaniem metody ładowania tablicy z pliku a ty mu każesz pisać sterowniki do ini/xml/yaml? Przecież to się ogranicza do 1-2 interfejsów i dwóch obiektów współpracujących ze sobą. Takie coś kompletny nowicjusz powinien być wstanie zrobić po pierwszym lepszym "wprowadzeniu w OOP".Cytat W zasadzie to dlaczego? Globalny dostęp, jako singleton ma sens w przypadku plików konfiguracyjnych i jest dość przejrzysty. 1. Poza nielicznymi przypadkami globalny dostęp do czegokolwiek jest raczej niepożądany.2. Dostęp do konfiguracji przy pomocy singletona będzie niewiele czytelniejszy od zwykłego rozwiązania (IoC), a niesie za sobą standardowy zestaw problemów wynikających z tak ścisłego powiązania dwóch obiektów ze sobą. Cytat Zamierzam korzystać tylko z plików conf: *.php lub .ini . Nie chcę XML, YAML itd bo to mi do tego nie potrzebne. Skoro już wiesz, że będziesz korzystać z PHP oraz INI skorzystanie z strategii jest w pełni uzasadnione. Szczególnie, zważywszy na fakt, że zapewne pliki INI będziesz chciał cache'ować.
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Eydcja. A jak robisz zamieszanie z plikami to świadomie, poza tym nie widze problemu aby usunać inne mysql.ini Config::del('mysql') (IMG:style_emoticons/default/wink.gif) zaraz po wczytaniu z "globalnego zasięgu".
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Przy rozbudowanej aplikacji takie zamieszanie raczej jest uzasadnione (IMG:style_emoticons/default/smile.gif) a usuwać i ponownie ładować te same dane zamiast użyć rejestru.. hmm mało optymalne
|
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Cytat 1. Poza nielicznymi przypadkami globalny dostęp do czegokolwiek jest raczej niepożądany. Z powodu? Cytat 2. Dostęp do konfiguracji przy pomocy singletona będzie niewiele czytelniejszy od zwykłego rozwiązania (IoC), a niesie za sobą standardowy zestaw problemów wynikających z tak ścisłego powiązania dwóch obiektów ze sobą. Jakich problemów? To jest raczej kwestia tego, co jest dla Nas wygodniejsze. Pierwszy sposób nie ma przewagi nad drugim i odwrotnie. Cytat Przy rozbudowanej aplikacji takie zamieszanie raczej jest uzasadnione a usuwać i ponownie ładować te same dane zamiast użyć rejestru.. hmm mało optymalne I tu się zgadzamy. choć nie wiem za bardzo, aby przytoczone tu rozwiązanie robiło burdel (chyba że jest źle napisane). Ten post edytował !*! 26.02.2013, 12:31:30 |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@!*!: Globalny dostęp/sningleton niesie za sobą pewną konstrukcję, a mianowicie:
Taka konstrukcja tworzy relację pomiędzy naszym obiektem, a klasą Config. Bezpośrednią (tj. opartą o klasę, a nie implementację interfejsu) relację, która w dodatku jest ukryta (nagle w środku kodu jest jakieś odwołanie). No to teraz lista problemów: 1. Nasz obiekt, który może nie mieć kompletne żadnego związku z resztą systemu, nagle staje się niepotrzebnie uzależniony od klasy Config. Kodu nie da się łatwo odizolować - tracimy jego uniwersalność/przenośność. 2. Skoro dla naszego obiektu nie da się wytworzyć pożądanego środowiska (ponieważ sam obiekt je definiuje), tak prosta rzecz jak chociażby testy (niekoniecznie jednostkowe) stają się nagle bardzo trudnym zadaniem. 3. Zdecydowanie trudniej jest utworzyć dwa obiekty o różnej konfiguracji, ponieważ ta jest na sztywno zapisana w klasie Config. Konieczne byłyby potworki typu:
|
|
|
![]()
Post
#22
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Cytat 1. Nasz obiekt, który może nie mieć kompletne żadnego związku z resztą systemu, nagle staje się niepotrzebnie uzależniony od klasy Config. Kodu nie da się łatwo odizolować - tracimy jego uniwersalność/przenośność. Albo rybki, albo akwarium. Jak piszesz coś co ma być publiczne, to raczej używasz czystego PHP lub jeśli jest dedykowane na jakiś FW to ichniejszych metod. To że są zależności to raczej normalne i trudno by było zbudować coś większego bez nich. Już nie wspominając że na "czysto" raczej się przez takie narzędzia danych nie ustala, a raczej przez parametry metody i nawet jakby Config::get/set() w niej istniał, to ustawienie parametru nie musi go wykonać. Cytat 3. Zdecydowanie trudniej jest utworzyć dwa obiekty o różnej konfiguracji, ponieważ ta jest na sztywno zapisana w klasie Config. Konieczne byłyby potworki typu: To samo co wyżej. Jak potrzebujesz konfiguracji, trudno aby obiekty były gołe bez możliwości wgrania CFG z zewnątrz. |
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 859 Pomógł: 177 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki. Czyli mam zrobić na zasadzie load, get...
Metoda load moze wygladac tak:
(IMG:style_emoticons/default/questionmark.gif) Przepraszam za amatorkę w moich kodach ale staram się jak tylko potrafie |
|
|
![]()
Post
#24
|
|
Grupa: Moderatorzy Postów: 4 069 Pomógł: 497 Dołączył: 11.05.2007 Skąd: Warszawa ![]() |
Jeśli już to:
self::$configs[$file] = parse_ini_file('Config/'.$file.'.ini',true); |
|
|
![]()
Post
#25
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat To że są zależności to raczej normalne i trudno by było zbudować coś większego bez nich. Zależności są nieuniknione i same w sobie nie są absolutnie niczym złym. Chodzi o to by zależności były luźne, oparte na interfejsach, nie sztywne, pracujące na klasach. Pierwsze podejście ma właściwie same zalety, jest naturalne dla OOP - Google: IoC pros. Drugie powoduje masę problemów. Jedną, jedyną zaletą drugiego rozwiązania jest jego zwięzłość - przy małych czy "śmieciowych" projektach dobra architektura systemu zwyczajnie w świecie nie ma znaczenia.Cytat To samo co wyżej. Jak potrzebujesz konfiguracji, trudno aby obiekty były gołe bez możliwości wgrania CFG z zewnątrz. Nie zrozumiałeś sensu podanego przeze mnie przykładu. Chodzi o problemy z ustawieniem zewnętrznego środowiska (tutaj konfiguracji) w przypadku ścisłych zależności, zresztą chyba wyższość jednego rozwiązania nad drugim jest widoczna przy bezpośrednim zestawieniu:
Cytat Albo rybki, albo akwarium. Jak piszesz coś co ma być publiczne, to raczej używasz czystego PHP lub jeśli jest dedykowane na jakiś FW to ichniejszych metod. Jeżeli FW nie jest napisany w taki sposób, jak tutaj się sugeruje, to można mieć i rybki i akwarium niedużym/zerowym nakładem pracy.
Ten post edytował Crozin 26.02.2013, 18:56:50 |
|
|
![]()
Post
#26
|
|
Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
ja bym raczej dał tak
dzięki tamu unikasz wielokrotnego wczytywania i parsowania pliku |
|
|
![]()
Post
#27
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Crozin - przeczytałem, to wczoraj... czytam to dzisiaj, razem z linkami i nadal nie widzę wyższości jednego nad drugim o której piszesz.
Kwestia indywidualnego podejścia do projektowania samych bebechów, tudzież wygody. |
|
|
![]()
Post
#28
|
|
Grupa: Zarejestrowani Postów: 859 Pomógł: 177 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mam sobie tablice w pliku config:
I wczytuje go: Config::load('plik'); //funckja load:
I jak zrobić aby za pomocą get pobiera dowolny ciąg czyli:
Lub
Wiem, ze trzeba podzielić argument który podajemy funkcji get funckją explode, a później jak to dynamicznie obrobić? Bo łatwo jest sobie zrobc return self::$cos[$explode[0]][$explode[1]][$explode[2]]; //to dla pierwszego przykladu. Proszę o jakieś pomysły bo póki co korzystam z parse ini ale to siedzi cały czas w mojej głowie... Pozdrawiam Ktoś da jakąś wskazówkę? |
|
|
![]()
Post
#29
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Kiedyś napisałem coś takiego:
Zresztą, wspomniałem już żebyś się zapoznał z cakePHP, mechanizm jest bliźniaczy. Ten post edytował !*! 28.02.2013, 11:04:27 |
|
|
![]()
Post
#30
|
|
Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
wiem że bardzo "statycznie" ale to tylko pokazówka
|
|
|
![]()
Post
#31
|
|
Grupa: Zarejestrowani Postów: 435 Pomógł: 40 Dołączył: 16.02.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Crozin - przeczytałem, to wczoraj... czytam to dzisiaj, razem z linkami i nadal nie widzę wyższości jednego nad drugim o której piszesz. Kwestia indywidualnego podejścia do projektowania samych bebechów, tudzież wygody. Nie, to nie kwestia indywidualnego podejścia. To kwestia pewnych standardów, wypracowanych reguł w inżynierii oprogramowania. Za @Crozinem - oczywiście jeżeli robisz małe projekty to nie uświadczysz większej różnicy. Ale czemu od początku nie robić tego dobrze? Polecam: (w tym przypadku najlepiej od slajdu 6) http://www.slideshare.net/fabpot/dependenc...ion-in-php-5354 |
|
|
![]()
Post
#32
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
W tym przypadku słowo "standard" to lekkie nadużycie.
Dobra prezentacja, o to właśnie mi chodziło, aby np. Klasa User miała sama w sobie możliwość ustalenia konfiguracji, ale ni jak ma to się do samej klasy odczytu CFG. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 13:38 |