2011-09-11 376 views
2

問題更新ob_start()PHP中模板的替代方法?

我建立一個MVC框架,爲我的模板和意見,我將有一個主頁模板文件和我的意見將被納入到這個模板。

我見過的唯一辦法做到這一點是使用輸出buffereing

ob_start(); 
include 'userProfile.php'; 
$content = ob_get_clean(); 

是否有這樣做的任何其他方式?我認爲輸出緩衝並不是性能上最好的,因爲它使用大量內存

這是一個樣本控制器,$this->view->load('userProfile', $profileData); 是將使用輸出分叉加載的部分,以便它可以包含在主模板中下面到$內容部分

視圖類

public function load($view,$data = null) { 

    if($data) { 
     $this->data = $data; 
     extract($data); 
    } elseif($this->data != null) { 
      extract($this->data); 
    } 

    ob_start(); 
    require(APP_PATH . "Views/$view.php"); 
    $content = ob_get_clean(); 
} 

控制器

/** 
* Example Controller 
*/ 
class User_Controller extends Core_Controller { 



    // domain.com/user/id-53463463 
    function profile($userId) 
    { 
     // load a Model 
     $this->loadModel('profile'); 
     //GET data from a Model 
     $profileData = $this->profile_model->getProfile($userId); 

     // load view file 
     $this->view->load('userProfile', $profileData); 
    } 
} 

主網站模板

<html> 
<head> 

</head> 

<body> 

<?php echo $content; ?> 

</body> 
</html> 
+2

你有沒有考慮使用一些已經存在的如Twig或Smarty? – Treffynnon

+2

您是如何得出結論輸出緩衝使用大量內存的?你真的分析了代碼,發現這確實是這樣嗎? –

+1

如果你想把渲染後的模板放入一個變量中,它總是會消耗至少渲染模板的大小。 – arnaud576875

回答

0

使用模板系統並不必然依賴於輸出緩衝。這裏有你給夫婦的示例代碼的東西,當然不應該被認爲是理所當然的:

一:

flushblocks(); // what does this do?? 

和兩個:

$s = ob_get_clean(); 

爲什麼代碼捕獲模板輸出到一個變量?輸出前是否需要對此進行一些處理?否則,您可能會丟失輸出緩衝呼叫,並立即將輸出發送到瀏覽器。

+0

對不起flushblocks();因意外而留在那裏,這不應該在這個例子中。我的主要模板文件將包含頁面佈局(標題,正文,側欄,頁腳)。 Thje正文部分有一個變量$ content,它可以是$ s = ob_get_clean()中的內容; $ s會保存來自MVC的特定視圖的內容 – JasonDavis

+0

我已經用更好的示例更新了我的整篇文章 – JasonDavis