Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP] Config
aras785
post
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:

  1. <?php
  2. namespace Lib;
  3.  
  4. class Config {
  5. public static $con;
  6. public static function get($var) {
  7. require('Config/config.php');
  8. self::$con = $config[$var];
  9. return(self::$con);
  10.  
  11. }
  12. }


I w pliku php:

  1. $config['mysql'] = array (
  2. 'host'=>'localhost',
  3. [..]
  4. );
  5. [..]
Go to the top of the page
+Quote Post
!*!
post
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

  1. Config:read('mysql.login');


Co odpowiada tablicy

Cytat
array('mysql' => array('login'=>'test'))


Nie potrzebnie tworzysz zmienną $config.

file.php
  1. return array();

  1. require_once 'Config/file.php';


I co jak będę chciał wczytać inny plik?

Ten post edytował !*! 25.02.2013, 20:17:04


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
wujek2009
post
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:
  1. public static function get($var, $default = NULL)
  2. {
  3. return array_key_exists($var, self::$con) ? self::$con[$var] : $default;
  4. }


Oczywiście funkcja instance/init musiałaby się uruchamiać wraz z aplikacja.
Go to the top of the page
+Quote Post
Crozin
post
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ę.
Go to the top of the page
+Quote Post
Spawnm
post
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ę.
Go to the top of the page
+Quote Post
!*!
post
Post #6





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Cytat(Crozin @ 25.02.2013, 20:27:32 ) *
Dlaczego korzystasz z metod/klasy statycznej, skoro możesz, i zapewne będziesz miał, wiele różnych plików konfiguracyjnych?

Jedno nie wyklucza drugiego.

Cytat(Crozin @ 25.02.2013, 20:27:32 ) *
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


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
CuteOne
post
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.
Go to the top of the page
+Quote Post
aras785
post
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ć?
Go to the top of the page
+Quote Post
CuteOne
post
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
Go to the top of the page
+Quote Post
pyro
post
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:

  1. class Blah {
  2.  
  3. public function something() {
  4.  
  5. Config::set('blah', 1);
  6.  
  7. }
  8.  
  9. }


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 tongue.gif

// EDIT

Jakieś argumenty mile widziane.

Ten post edytował pyro 26.02.2013, 11:12:52


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
CuteOne
post
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 smile.gif

Ten post edytował CuteOne 26.02.2013, 11:19:57
Go to the top of the page
+Quote Post
!*!
post
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).


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
pyro
post
Post #13





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(CuteOne @ 26.02.2013, 11:18:47 ) *
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ś?


  1. Config::load('main_config.ini', 'bulka');
  2. Config::load('lang_config.ini', 'chleb');
  3. Config::load('local_lang.ini', 'mleko');
  4.  
  5. // ...
  6.  
  7. echo Config::get('bulka.cena'); // 2 zł
  8. echo Config::get('mleko.cena'); // Fatal Error: Allowed memory size of 8388608 bytes exhausted ...


// EDIT

@!*! mnie wyprzedził.

Ten post edytował pyro 26.02.2013, 11:26:57


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
CuteOne
post
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
  1. resources.db.host = localhost


mssql.ini
  1. resources.db.host = 10.1.1.1


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
Go to the top of the page
+Quote Post
!*!
post
Post #15





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Cytat(CuteOne @ 26.02.2013, 11:26:39 ) *
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() wink.gif a skoro jest kilka mysql.ini to ścieżki się nie zgadzają i powinien być inny identyfikator.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
pyro
post
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.


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
Crozin
post
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ć.
Go to the top of the page
+Quote Post
!*!
post
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') wink.gif zaraz po wczytaniu z "globalnego zasięgu".


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
CuteOne
post
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 smile.gif a usuwać i ponownie ładować te same dane zamiast użyć rejestru.. hmm mało optymalne
Go to the top of the page
+Quote Post
!*!
post
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


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Aktualny czas: 19.08.2025 - 09:57