PanoramicaPHP - template con tag personalizzati - è un uso legittimo di eval?
Intorno alla fine del 2009, ho scritto un semplice sistema di template per PHP/HTML da utilizzare in-house dai nostri progettisti per siti web tipo brochure-ware. L'obiettivo del sistema è consentire il template in HTML altrimenti puro tramite tag personalizzati elaborati da PHP. Ad esempio, una pagina su modelli potrebbe assomigliare a questo:
<tt:Page template="templates/main.html">
<tt:Content name="leftColumn">
<p> blah blah </p>
...
</tt:Content>
<tt:Content name="rightColumn">
<p> blah blah </p>
...
</tt:Content>
</tt:Page>
Il modello stesso potrebbe essere simile a questa:
<html>
<head>...</head>
<body>
<div style="float:left; width:45%">
<tt:Container name="leftColumn" />
</div>
<div style="width:45%">
<tt:Container name="rightColumn" />
</div>
</body>
</html>
Oltre alla pagina e contenuti/tag container, ci sono un paio di altri tag inclusi nel nucleo per cose come il controllo del flusso, l'iterazione su una collezione, l'output di valori dinamici, ecc. Il framework è progettato in modo che sia molto facile aggiungere il proprio insieme di tag registrati sotto un altro prefisso e spazio dei nomi.
personalizzati Tag a PHP
Come analizziamo questi tag personalizzati? Poiché non si garantisce che il file HTML sia un XML ben formato, soluzioni come XSLT/XPATH non saranno affidabili. Invece, usiamo un'espressione regolare per cercare tag con prefissi registrati e sostituirli con codice PHP. Il codice PHP è un progetto basato su stack ... dopo aver incontrato un tag di apertura, un oggetto che rappresenta il tag viene creato inserito nello stack e viene eseguita la sua "funzione di inizializzazione" (se presente). Ogni volta che viene rilevato un tag di chiusura registrato, l'oggetto più recente viene estratto dallo stack e viene eseguita la sua "funzione di rendering".
Così, dopo il quadro sostituisce i tag di template con PHP, la nostra pagina di esempio potrebbe essere simile a questo (in realtà è un po 'più brutta):
<?php $tags->push('tt', 'Page', array('template'=>'templates/main.html')); ?>
<?php $tags->push('tt', 'Content', array('name'=>'leftColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->push('tt', 'Content', array('name'=>'rightColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->pop(); ?>
Il buono, il brutto e eval
Ora, come eseguire il nostro codice PHP appena generato? Posso pensare ad alcune opzioni qui. Il più semplice è semplicemente la stringa eval
, che funziona abbastanza bene. Tuttavia, qualsiasi programmatore ti dirà "eval è malvagio, non usarlo ..." quindi la domanda è, c'è qualcosa di più appropriato di eval
che possiamo usare qui?
Ho considerato l'utilizzo di un file temporaneo o memorizzato nella cache, utilizzando i flussi di output php://
, ecc., Ma per quanto posso vedere questi non offrono alcun vantaggio reale rispetto a eval
. Il caching potrebbe accelerare le cose, ma in pratica tutti i siti che abbiamo su questa cosa sono già incredibilmente veloci, quindi a questo punto non vedo la necessità di ottimizzare la velocità.
Domande
Per ciascuna delle cose su questa lista: è una buona idea? Riesci a pensare ad un'alternativa migliore?
- l'idea in generale (tag personalizzati per HTML/PHP)
- conversione dei tag di codice php invece di elaborazione direttamente
- l'approccio basato su stack
- l'uso di
eval
(o simile)
Grazie per la lettura e TIA per qualsiasi consiglio. :)
+1 per una domanda ben formattata, ben scritta e ben pensata. – gpmcadam
Grazie. OT: Mi piace il tuo avatar. Gigantor di Evol Intent indossava una maglietta con lo stesso identico design quando è venuto qui alcuni anni fa. È un logo per un'etichetta discografica o qualcosa del genere, o solo un disegno casuale? Lo stai chiedendo da anni. –