Come posso disaccoppiare i dati di configurazione dal programma che li utilizza?

3

Sono un programmatore principiante che ha scritto un'applicazione Spider in PHP. Attualmente ci sono tre parti:

1) The Spider (spider.php)
2) The Harvester (harvest.php)
3) The Configuration file (for example, craigslist_config.php)

Uso lo spider per cercare sul Web gli oggetti che voglio acquistare. Un elemento può essere trovato su qualsiasi sito web, come eBay, Craigslist, ecc. L'Harvester fornisce tre funzioni allo spider in modo che possa agire sui dati che trova - get_title_from($markup) , get_description_from($markup) e get_price_from($markup) .

Ogni sito web che voglio spider ha, ovviamente, un diverso markup che circonda i dati che voglio estrarre. Il mio file di configurazione contiene un array di configurazione che contiene i modelli regex per ciascuno degli elementi che voglio trovare. La struttura del file è sempre la stessa, l'unica cosa che cambia sono i modelli regex. Quindi, avrei craigslist_config.php, ebay_config.php, ecc.

$conf = array(
    'title' => ' specific_site title pattern',
    'description => 'specific_site description pattern',
    'price' => 'specific_site price pattern'
);

Il mio problema è quando voglio aggiungere un nuovo sito web. Devo modificare il file Spider.php e aggiungerlo a un'istruzione "if, elseif" in continua crescita che rileva quale sito è attualmente in fase di lettura e carica il file di configurazione corretto, che a sua volta alimenta i dati REGEX corretti alle funzioni harvester .

Come posso disaccoppiare la mia configurazione dal mio file Spider.php? Quello che ho progettato non mi sembra una soluzione flessibile e scalabile, e non voglio dover fare a pezzi con spider.php ogni volta che voglio aggiungere o portare via un nuovo sito.

In definitiva, quello che sto cercando di ottenere è la possibilità di inserire semplicemente un nuovo file di configurazione nella mia directory di configurazione e spostare la logica 'if, elseif' da qualche altra parte in modo che le funzioni spider e harverster non debbano mai preoccuparsi di cosa i file sono o non sono inclusi nella directory di configurazione. È il "altrove" che ho difficoltà a capire. In realtà, sarebbe ancora meglio se potessi sbarazzarmi della logica "if else" tutti insieme in modo che tutto funzionasse ".

Il mio attuale design non è un approccio OOP, tuttavia non sono contrario a uno. Attualmente sto leggendo "PHP Objects, Patterns and Practice" per essere aggiornato su OOP e sui relativi pattern di progettazione, quindi sentiti libero di suggerire in quella direzione se dovessi ritenerlo una soluzione.

EDIT: in base alla direzione di Doc Brown, ho trovato il seguente. Ho singoli file di configurazione con contenuti come questi:

$conf['specificwebsite1.com'] = array(
    'title' => 'title pattern',
    'price' => 'price pattern',

    etc...
);  

Nel mio file Harvester ho una nuova funzione chiamata load_config($url, $config) . Come suggerito, faccio scorrere tutti i file di configurazione e li carico in un grande array $ conf. Quindi, la funzione load_config controlla se la chiave è una sottostringa dell'url che sto leggendo attualmente. In tal caso, carica tutti i valori necessari per continuare l'analisi. Questa è la funzione:

function load_config($url, $config){
  foreach($config as $key => $value){
    if(stristr($url, $key) !== FALSE){
      ## see if a key in our config file
      ## is a substring of our url. 
      $conf = $config[$key];
      break;
    } else {

      $conf = FALSE;
    }
  }

  return $conf;
}

Funziona molto bene, quindi lo accetterò come risposta. Ma non esitate a dare suggerimenti per miglioramenti nei commenti o come un'altra risposta.

    
posta user658182 17.04.2013 - 04:13
fonte

2 risposte

3

Ultimately, what I am trying to achieve is the ability to simply drop in a new configuration file into my config directory

Per prima cosa, aggiungi l'indirizzo web correlato al tuo file di configurazione:

$conf = array(
    'url' => ' specific_site url or url pattern',
    'title' => ' specific_site title pattern',
    'description => 'specific_site description pattern',
    'price' => 'specific_site price pattern'
);

Ora cambia il codice in Spider.php che controlla tutti i file .php in quella directory di configurazione, li carica tutti in modo dinamico uno per uno e memorizza il contenuto "$ conf" in un dizionario in cui l'url è usato come chiave. Quindi dovrebbe essere facile sostituire la lista "if-else" con un semplice loop su quel dizionario.

    
risposta data 17.04.2013 - 08:11
fonte
3

Conserva i file di configurazione il più semplice possibile. Ciò significa: evitare codice PHP e ridondanza (come XML). Un formato adatto è il formato INI, che può essere letto da PHP in un array.

[specificwebsite1.com]
title="title pattern"
price="price pattern"

[anotherwebsite.com]
title="title pattern"
price="price pattern"

Con ciò, i tuoi file di configurazione sono leggibili e facili da mantenere, e puoi inserire diverse configurazioni in un unico file.

Il prossimo passo è creare una directory per questi file, chiamiamola config . Archiviare i file di configurazione in quella directory, assegnandoli a un nome che faciliti la ricerca di uno specifico.

Ora puoi leggere le configurazioni da PHP:

$configs = array();
foreach (glob('config/*.ini') as $filename) {
    $configs = array_merge($configs, parse_ini_file($filename, true));
}

$configs ora contiene tutte le tue configurazioni, indicizzate in base al nome del sito.

    
risposta data 17.04.2013 - 13:36
fonte

Leggi altre domande sui tag