B
Bgag
Hallo zusammen.
Ich habe mich schon seit längerem mit dem Problem des Konfigurations-Managements beschäftigt. Dabei habe ich mir verschiedene Ansätze überlegt und auch getestet. Die erste und auch einfachste Idee - eine PHP-Datei voller Variabeln. Der Nachteil ist, dass man nicht ohne weiteres automatisch neue Punkte hinzufügen, alte löschen oder ganz einfach vorhandene editieren kann. Dadurch fällt diese Option weg.
Mein nächster Ansatz baute auf *.ini-Dateien, die relativ komfortabel mit parse_ini_file() ausgelesen werden können. Leider stellt sich auch hier das Problem des editierens. Alle HTML-Codes mit Attributen stellen ein Problem dar, da parse_ini_file() gequotete Bereiche besonders behandelt. Zudem werden oftmals Kommentare beim schreiben der *.ini-Datei gelöscht, da dies mit einer eigenen Funktion geschehen muss.
Ich persönlich habe mich für die dritte Methode entschieden. Diese arbeitet ebenfalls mit *.ini-Dateien, baut allerdings nicht auf parse_ini_file() auf. viel mehr wird hier mal wieder auf RegExp gesetzt. Meine Klasse Config.php ist zwar noch nicht ganz fertig, da die Methoden zum Anlegen und erweitern von Konfigurations-Dateien fehlen, aber das wird sich noch ändern. Leider ist nun ein kleines Problem aufgetreten. Und zwar versuche ich mit Hilfe der magischen Methode __set() einem Key des $config-Arrays ein neues Value zuzuordnen. Dies soll in der Datei editconfig.php, die den Klassen-Aufruf enthält automatiesiert in einer Schleife, die mit $_REQUEST[]-Daten gefüttert wird, geschehen. Dort liegt auch der Fehler. Die Funktion wirft eine Exception, da der Key, der gesetzt werden soll, nicht existiert. In dieser Datei sollen nämlich alle in der Konfigurations-Datei enthaltenen Keys aktualisiert werden, wozu sie auf ihre Existenz überprüft werden. Leider wird dabei hinter alle Keys ein "_" gesetzt, wodurch aus dem Key "dbname", der Key "dbname_" wird, der natürlich nicht gefunden wird und der Fehler wird geworfen.
Fehler: Liegt in dem Aufruf der in der if()-Abfrage gestartet wird.
Frage: Wie muss ich den Aufruf abändern, damit dieser Fehler nicht weiter auftritt, oder ist es einfach sinnvoller diesen Fehler einfach zu umgehen, indem ich auf die Verwendung der magischen Methoden __set() und __get() verzichte?
Wäre euch sehr sehr dankbar für eure Hilfe!
MfG, Andy
Config.php
config.ini
editconfig.php
Ich habe mich schon seit längerem mit dem Problem des Konfigurations-Managements beschäftigt. Dabei habe ich mir verschiedene Ansätze überlegt und auch getestet. Die erste und auch einfachste Idee - eine PHP-Datei voller Variabeln. Der Nachteil ist, dass man nicht ohne weiteres automatisch neue Punkte hinzufügen, alte löschen oder ganz einfach vorhandene editieren kann. Dadurch fällt diese Option weg.
Mein nächster Ansatz baute auf *.ini-Dateien, die relativ komfortabel mit parse_ini_file() ausgelesen werden können. Leider stellt sich auch hier das Problem des editierens. Alle HTML-Codes mit Attributen stellen ein Problem dar, da parse_ini_file() gequotete Bereiche besonders behandelt. Zudem werden oftmals Kommentare beim schreiben der *.ini-Datei gelöscht, da dies mit einer eigenen Funktion geschehen muss.
Ich persönlich habe mich für die dritte Methode entschieden. Diese arbeitet ebenfalls mit *.ini-Dateien, baut allerdings nicht auf parse_ini_file() auf. viel mehr wird hier mal wieder auf RegExp gesetzt. Meine Klasse Config.php ist zwar noch nicht ganz fertig, da die Methoden zum Anlegen und erweitern von Konfigurations-Dateien fehlen, aber das wird sich noch ändern. Leider ist nun ein kleines Problem aufgetreten. Und zwar versuche ich mit Hilfe der magischen Methode __set() einem Key des $config-Arrays ein neues Value zuzuordnen. Dies soll in der Datei editconfig.php, die den Klassen-Aufruf enthält automatiesiert in einer Schleife, die mit $_REQUEST[]-Daten gefüttert wird, geschehen. Dort liegt auch der Fehler. Die Funktion wirft eine Exception, da der Key, der gesetzt werden soll, nicht existiert. In dieser Datei sollen nämlich alle in der Konfigurations-Datei enthaltenen Keys aktualisiert werden, wozu sie auf ihre Existenz überprüft werden. Leider wird dabei hinter alle Keys ein "_" gesetzt, wodurch aus dem Key "dbname", der Key "dbname_" wird, der natürlich nicht gefunden wird und der Fehler wird geworfen.
Fehler: Liegt in dem Aufruf der in der if()-Abfrage gestartet wird.
PHP:
foreach( $new as $key => $value)
{
if( ($key != 'reset') && ($key != 'submit') && ($key != 'path') )
{
$cp->$key = $value;
}
}
Frage: Wie muss ich den Aufruf abändern, damit dieser Fehler nicht weiter auftritt, oder ist es einfach sinnvoller diesen Fehler einfach zu umgehen, indem ich auf die Verwendung der magischen Methoden __set() und __get() verzichte?
Wäre euch sehr sehr dankbar für eure Hilfe!
MfG, Andy
Config.php
PHP:
<?php
error_reporting(E_ALL);
/***
* The Config class allows reading the configuration and editting it
*
* @package Config
* @version 0.1
* @author Andreas Wilhelm <Andreas2209@web.de>
* @copyright Andreas Wilhelm
**/
class Configuration
{
private $file;
private $config = array();
/**
* Cunstructor - Loads configuration from path
*
* @access public
* @param Str $file
* @return NONE
*/
public function __construct($file)
{
// set path to config-file
$this->file = $file;
// save configuration to an array
$this->parse();
}
/**
* __get() - Gets the value of an config-item
*
* @access: public
* @param Str $name
* @return String
*/
public function __get($key)
{
if( !isset($this->config[$key]) )
{
throw new Exception('Cannot get item '.$key.'.');
}
return $this->config[$key];
}
/**
* __set() - Assigns a new value to an entry of the config
*
* @access: public
* @param Str $key
* @param Str $value
* @return NONE
*/
public function __set($key, $value)
{
if( !isset($this->config[$key]) )
{
throw new Exception('Cannot set item '.$key.'.');
}
$this->config[$key] = $value;
}
/**
* getConfig() - Returns the whole configuration in an array
*
* @access: public
* @return Array
*/
public function getConfig()
{
return $this->config;
}
/**
* parse() - Reads configuration into an array
*
* @access: public
* @return NONE
*/
public function parse()
{
// save each line of data to an array-element
$lines = file($this->file);
foreach($lines as $line => $value)
{
// save information to array
if( preg_match('/([^:]+)=(.+)/m', $value, $match) )
{
$this->config[$match[1]] = $match[2];
}
}
}
/**
* save() - Save Configuration to file
*
* @access: public
* @return NONE
*/
public function save()
{
$nf = '';
$fp = fopen( $this->file, 'r' );
while( $line = fgets($fp) )
{
if ( preg_match('/([^:]+)=(.+)/m', $line, $match) )
{
$nf .= $match[1]."=".$this->config[$match[1]]."\n";
}
else
{
$nf .= $line;
}
}
fclose( $fp );
$fp = fopen( $this->file, 'w' );
fwrite( $fp, $nf );
fclose( $fp );
}
}
?>
config.ini
Code:
# database values
dbhost = your_database_host
db = your_db
dbuser = testuser
dbpwd = testpwd
# meta tags
title = title of your website
author = the author of the website
copyright = copyright by
discription = this is a great website
keywords = website, your, nice
favicon = favicon.ico
# error pages
error400 = Error 400 - Bad request.
error404 = Error 404 - Page could not be found.
error500 = Error 500 - Internal Server Error.
editconfig.php
PHP:
$cp = new Configuration('config/config.ini');
// handle request-data
if( isset($_REQUEST) )
{
$new = $_REQUEST;
foreach( $new as $key => $value)
{
if( ($key != 'reset') && ($key != 'submit') && ($key != 'path') )
{
$cp->$key = $value;
}
}
$cp->save();
}
// get changed configuration
$config = $cp->getConfig();