2013-05-14 12 views
5

Obecnie robię to tak:Lazy zmienne ładowanie w szablonach

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

W moim kodu kontrolera:

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

Szablon jest to skrypt PHP jak

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

Zastanawiam się, czy możliwe jest leniwne załadowanie tych zmiennych w jakiś sposób, więc tak naprawdę nie uruchamiam get_title() lub get_content(), dopóki szablon nie zażąda zmiennej.

Czy to możliwe, bez tworzenia parsera szablonów? Naprawdę chciałbym trzymać się prostych skryptów .php i html jako szablonów.


W skrócie, to pytam się, czy jest to możliwe do automatycznego przypisania wartości do zmiennej tylko wtedy, gdy jest to pierwszy wniosek.

$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) 
} 

Odpowiedz

1

Moim zdaniem, jeśli nie chcesz zmienić szablon, aby wyodrębnić zmienne, można utworzyć na przykład tablicę, która będzie wiedział, które zmienne są co potrzebom szablonu.

Możesz rozważyć funkcję (nazwijmy ją caller), do której przechodzą wszystkie parametry i nazwę szablonu. caller może wybrać, które zmienne są wymagane. Ten pomysł przypomina klasę fabryczną.

myślę, że nie ma innego sposobu, ale ...

Podczas wkładania szablon i użyć zmiennej unexistent zostanie pokazany ostrzeżenie. Możesz sprawić, że PHP będzie wyrzucać wyjątki w ostrzeżeniach, a następnie analizować je w bloku try ... catch. Myślę, że to zbyt skomplikowane i nie warte wysiłku.

EDIT

Trzecim pomysłem jest tworzenie obiektów zamiast tablic. Obiekt zachowałby całą twoją zmienną $args. W swoim szablonie zmień po prostu <?php echo $title; ?> na <?php echo $argument_object->getTitle(); ?> i zakoduj metodę getTitle(). getTitle(), jako metoda, a nie funkcja, byłaby wówczas uruchamiana tylko na żądanie.