Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Config class
Forum PHP.pl > Forum > PHP
ActivePlayer
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.
hwao
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.
ActivePlayer
jedno ale...

w jaki sposob MySQLConfigSource ma udostepnic metode setParam() w w CoreConfig?
Denver
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
hwao
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 ;-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.