Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Config class, Inteligentne zaprojektowanie
ActivePlayer
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


Mam w planach przygotowanie klasy o dumnie brzmiącej nazwie 'Core_Config', której będę używał do przechowywania konfiguracji systemowych jak i niesystemowych.

Klasa ma dostarczać następujących możliwości:

dostęp do konfigów w każdym miejscu aplikacji, moge to rozwiązać na 2 sposoby, albo singleton, albo 'registry' które delikatnie mowiąc 'podpatrzyłem' (ctrl+c) z zenda:
  1. <?php
  2. // registry
  3. Carpo::registry('Config')->someParam;
  4. // lub singleton
  5. Core_Config::GetInstance()->someParam;
  6. ?>

nie zdecydowałem się jeszcze której z metod będe się trzymał, singleton jednak w tym momencie wydaje sie być rozsądniejszy.

Chciałbym w tak inteligentny sposob przygotować klase, aby moc dodawać do niej nowe 'rodzaje' przechowywania danych. Na starcie mam dwa - ini oraz mysql. Nie chciałbym tego jednak wpakować w jedną klasę. Chciałbym rodzielić to i w razie potrzeby mieć łatwo dopisać kolejne rodzaje, np pliki.txt, xml itp. Napewno tez w jakiś sposób musiałbym zawładnąć nadpisywaniem czy tam 'priorytetem' parametrów w momencie kiedy parametry w ini i mysql mają takie same nazwy.

Myslałem o zastosowaniu wzorca Factory:
  1. <?php
  2. ConfigFactory::build('ini','mysql');
  3. ?>

Tylko pytanie, jak przyjaźnie oddzielić kod odpowiedzialny za zarządzanie konfigami (W przypadku ini chodzi o zwykłe wczytanie danych z pliku, natomiast w momencie mysql'a chciałbym miec tez możliwość dodania metody setParam($name, $value);

myslalem o zastosowaniu klas abstrakcyjnych (Core_Config_Ini, Core_Config_Mysql, Core_Config_Xml), ale niestety nie napiszę
  1. <?php
  2. class Core_Config extends Core_Config_Ini, Core_Config_Mysql ...{}
  3. ?>

z wiadomych przyczyn.
Go to the top of the page
+Quote Post
hwao
post
Post #2


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Cod do singletona albo rejestru, możesz trzymać w obu, to przecież żadne problem - referencja.

Co do różnych zródeł:
  1. <?php
  2. interface ConfigSource {
  3. public function getData();
  4. }
  5.  
  6. class IniConfigSource implements ConfigSource {
  7.  protected $aData = array();
  8.  public function __construct( $sFile ) {
  9. $this->aData = parse_ini_file( $sFile );
  10.  }
  11.  public function getData() {
  12. return $this->aData;
  13.  }
  14. }
  15.  
  16. class CoreConfig {
  17.  public function addSource( ConfigSource $ConfigSource ) {
  18. $aData = $ConfigSource->getData(); // pobierasz dane, i dodajesz do globbalnych
  19.  }
  20. }
  21.  
  22. $CoreConfig = new CoreConfig();
  23. $CoreConfig->addSource( new IniConfigSource( './plik.ini' ) );
  24. $CoreConfig->addSource( new MySQLConfigSource( $ObiektDb ) );
  25. $CoreConfig->addSource( new PHPArrayConfigFile( 'podJakaZmienna', 'plik.php' ) );
  26. ?>


Tyle.
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


jedno ale...

w jaki sposob MySQLConfigSource ma udostepnic metode setParam() w w CoreConfig?
Go to the top of the page
+Quote Post
Denver
post
Post #4





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 24.09.2003
Skąd: Giżycko / Wrocław

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


Cytat
class IniConfigSource implementation ConfigSource {

Zamiast implementation powinno być oczywiście implements. Kolega hwao nieumyślnie się walnął w przykładzie winksmiley.jpg.

___
Juz go poprawilem:)
AP


--------------------
Go to the top of the page
+Quote Post
hwao
post
Post #5


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Tak nie możesz robić...

Możesz przerobić interfejs i dodac

  1. <?php
  2. interface ConfigSource {
  3.  public function getData();
  4.  public function set( $k, $v );
  5. }
  6. $Config = new MySQLConfigSource( $ObiektDb );
  7. $Config->set( 'a', 'Test1' );
  8. $Config->set( 'b', 'Test2' );
  9. $Config->set( 'c', 'Test3' );
  10. $Config->set( 'd', 'Test4' );
  11. // W tej metodzie nastepuję albo buffering, albo od razu zapis
  12.  
  13.  
  14. // dodanie danych do CoreConfig
  15. $CoreConfig->addSource( $Config );
  16. ?>


ConfigCore pobiera wszystkie dane, tworzy wspólna tablice, i udostępnia je jakimś algorytmem.

@Denver wszystko z głowy na szybko pisze, a dopiero wstałem ;-)
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 Aktualny czas: 20.08.2025 - 08:41