PHP Перемещение файла сопоставления конфигурации в XML, но как создать динамический XPATH - PullRequest
0 голосов
/ 21 июня 2010

Итак, у меня есть файл PHP, который я использую для определения всех своих констант, но теперь мне нужна гибкость использования XML вместо этого.

Пример файла конфигурации PHP

define("LOGIN_URL", "secure_login.php");
define("REDIRECT", "redirect.php");

define("MAPPED_VALUE_GREEN", "object_green");
define("MAPPED_VALUE_KEY", "object_key_12345");

What I 'я собираюсь сделать это:

<scriptNameConfig>
  <urls>
     <url alias="LOGIN_URL" scriptname="secure_login.php" location="optional/path/to/file"/>
     <url alias="REDIRECTL" scriptname="redirect.php" location="optional/path/to/file"/>
  </urls>
  <mapping>
     <mapped name="MAPPED_VALUE_GREEN" data="object_green"/>
     <mapped name="MAPPED_VALUE_KEY" data="object_key_12345"/>
  </mapping>
</scriptNameConfig>

Теперь это нормально, но я хочу использовать XPATH для извлечения значений из этого типа файла конфигурации, но хотел бы, чтобы он был достаточно динамичным, поэтому мне не нужноЖесткий код функции

Это мой базовый класс

class ParseXMLConfig {
    protected $xml;

    public function __construct($xml) {
        if(is_file($xml)) {
            $this->xml = simplexml_load_file($xml);
        } else {
            $this->xml = simplexml_load_string($xml);
        }
    }
}

И я расширяю его следующим образом

class ParseURLS extends ParseXMLConfig {

public function getUrlArr($url_alias) {
        $attr = false;
        $el = $this->xml->xpath("//url[@alias='$url_alias']");
        if($el && count($el) === 1) {
            $attr = (array) $el[0]->attributes();
            $attr = $attr['@attributes'];
        } 
        return $attr; // this will return the element array with all attributes
    }
}

Но проблема в том, если я хочу ввести новыйЗначение в файле Confie Я должен добавить какую-то функцию для XPATH для его анализа.Я хотел бы знать, есть ли у кого-нибудь идея о том, как сделать это универсальное / динамическое, поэтому добавление / изменение или удаление элементов / атрибутов в XML-файле конфигурации будет проще и менее трудоемким.

Спасибо за любые советы / примеры / код / ​​идеи, -Phill

1 Ответ

1 голос
/ 21 июня 2010

Мне любопытно - как вы думаете, какую именно гибкость вы получаете от этого?Вы проделали огромную работу, чтобы поместить материал в XML, просто чтобы преобразовать его в данные PHP.

Если вы хорошо разбираетесь с XML (то есть, ничто другое не использует эту конфигурацию), почему бы и нетчто-то вроде этого?

class Config
{
  private static $urls = array(
      'LOGIN_URL' => array(
          'scriptname' => 'secure_login.php'
        , 'location'   => 'optional/path/to/file'
      )
    , 'REDIRECTL' => array(
          'scriptname' => 'redirect.php'
        , 'location'   => 'optional/path/to/file'
      )
  );

  public static function getUrlArr( $alias )
  {
    if ( isset( self::$urls[$alias] ) )
    {
      return self::$urls[$alias];
    }
    throw new Exception( "URL alias '$alias' not defined" );
  }
}

Также, как примечание, у меня есть некоторые оговорки относительно вашего выбора, чтобы добавить глагол (синтаксический анализ) в имя класса.Если вы собираетесь пойти по этому пути, попробуйте использовать существительное-представление этого глагола.

class XmlConfigParser {}

EDIT

В этом случае вы не можете иметь имена методов, которые ссылаются нак структуре узла XML (если вы не хотите попасть в мир метапрограммирования)

Действительно, что бы вы ни делали, вы просто будете создавать синтаксический сахар над выражением XPath

Вот примеры методов, которые вы можете использовать

// Use XPath from the client
$config->fetchAttributesByXpath( "/urls/url[@alias='LOGIN_URL']" );

// Abstract away the XPah
$config->fetchAttributes( 'urls.url', 'alias', 'LOGIN_URL' );

Например, symfony делает что-то подобное со своими файлами конфигурации, которые являются YAML.В конфигурационном файле, например,

// app.yml
urls:
  LOGIN_URL: {scriptname: 'secure_login.php', location='optional/path/to/file'}

Вы получите значение примерно так:

$values = sfConfig::get( 'app_urls_LOGIN_URL' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...