2013-05-14 21 views
5

Derzeit ich es so mache:Lazy Loading Variablen in Vorlagen

function load_template($script, $args){ 
    extract($args); 
    require __DIR__ . '/templates/' . $script; 
} 

In meinem Controller-Code:

// if home page was requested 
load_template('home.php', array(
    'title' => get_title(), 
    'content' => get_content(), 
    ... 
)); 

Die Vorlage ist nur ein PHP-Skript wie

<!DOCTYPE html> 
<html> 
<head> 
    <title> <?php echo $title; ?> </titlee> 
... 

Ich habe mich gefragt, ob es möglich ist, diese Variablen irgendwie zu laden, also laufe ich eigentlich nicht get_title() oder get_content() bis die Vorlage die Variable spezifisch anfordert.

Könnte dies möglich sein, ohne ein Template-Parser-Ding zu erstellen? Ich würde gerne mit einfachen. PHP-Skripten und HTML als Vorlagen bleiben.


Kurz gesagt, was ich frage ist, ob es möglich ist, um einen Wert auf eine einzige Variable auto-zuweisen, wenn es zuerst beantragt wird.

$var = func(); // this should not run 

if($var){  // now the code above should run:) 
    echo $var; // <- the value that was just assigned (don't run func() again) 
} 

Antwort

1

Meiner Meinung nach, wenn Sie nicht die Variablen wollen Ihre Vorlage ändern zu extrahieren, können Sie zum Beispiel ein Array erstellen können, welche Variablen jede Vorlage Bedürfnisse kennen würde.

Sie können eine Funktion in Betracht ziehen (nennen wir sie caller), in die Sie alle Parameter und den Vorlagennamen eingeben. Die caller könnte wählen, welche Variablen benötigt werden. Diese Idee ist wie eine Fabrikklasse in oop.

Ich denke, es gibt keinen anderen Weg, aber ...

Während eine Vorlage einlegen und unexistent Variable verwenden, wird eine Warnung angezeigt. Sie können PHP veranlassen, Ausnahmen in Warnungen zu werfen und dann in Block try ... catch es zu analysieren. Ich denke, es ist zu kompliziert und keine Mühe wert.

EDIT

Die dritte Idee ist es, Objekte anstelle von Arrays zu erstellen. Das Objekt würde alle Ihre $args Variable behalten. Ändern Sie in Ihrer Vorlage einfach <?php echo $title; ?> in <?php echo $argument_object->getTitle(); ?> und codieren Sie die getTitle() Methode. Die getTitle(), als eine Methode keine Funktion, würde dann nur auf Anfrage ausgeführt werden.