2015-09-18 14 views
1

我正在將一項功能構建到Laravel 5應用程序中,該功能將允許您設置將在頁面頂部顯示的狀態橫幅內容。我們將使用此橫幅顯示特定於頁面的內容(狀態消息等)和站點範圍內的公告(每個用戶看到相同的內容,橫幅廣告一段時間保持不變)。Laravel 5:要緩存或使用會話來構建網站範圍的橫幅?

現在,我已經使用Laravel會話允許添加的橫幅實現通過調用任何控制器或中間件一個輔助方法:

// Call set_banner from in a controller or middleware (for persistent banners) 
function set_banner($banner_text, $banner_class, $banner_persistant=false, $replace=false) 
{ 
    $banners = session()->get('banners', []); 

    // Create new banner 
    $banner = [ 
      'text' => $banner_text, 
      'type' => $banner_class, 
      'persistent' => $banner_persistant 
      ]; 

    // Only put banner in array if it's not already there 
    if(!in_array($banner, $banners)) { 
     // Either override existing banners, or add to queue 
     if(!$replace) session()->push('banners', $banner); 
     else session()->put('banners', [$banner]); 
    } 
} 

// Called by default in the master.blade.php template 
function get_banners() 
{ 
    $banners = session()->pull('banners', Array()); 
    foreach($banners as $banner) { 
     // Print out each banner 
     print '<div class="col-md-12"><div class="text-center alert alert-block alert-'.$banner['type'].'">'; 
     print $banner['text']; 
     print '</div></div>'; 

     // Push back into the session if banner is marked as persistent 
     if ($banner['persistent']) session()->push('banners', $banner); 
    } 
} 

橫幅在控制器或中間件這樣創建的:

set_banner("<b>Note:</b> This is a sample persistant-scope banner set in a controller", "success", true); 

有沒有更好的方式來完成這兩個存儲頁面級別和站點範圍內的標語?我擔心的是,在每個頁面上加載會話可能效率不高,特別是對於長時間不會改變的橫幅。這種方法會混淆Laravel的緩存等嗎?

回答

0

正如你所說的橫幅不經常改變。因此,對我來說,我會使用緩存來實現它。這提高了性能,因爲我們只需要一次使用即可緩存橫幅。而對於其餘部分,它從Cache而不是Session中檢索得更快。

0

您是否想更改代碼以更改給定頁面的橫幅? 我會建議改爲創建一個「頁面」包,其中每個頁面的路由名稱被輸入到數據庫中。

從那裏,你的頁面服務提供者可以獲得Page :: getModel() - > banner_text或類似的東西。 該方法將查找與db中結果匹配的當前路由名稱的數據庫結果。

當一個控制器方法被觸發,你只需撥打 頁:: getBannerText()

這種方法將拉動當前路徑名,如果它存在拉涉及到該網頁的頁面結果,或創建它,如果它不不存在(獲取一切的簡單方法)。您可以將數據庫查詢結果緩存X小時,數天或其他任何時間,只要有人撥打電話,您甚至不需要處理客戶端上的任何存儲。

這使您可以修改數據庫中的值fascet。它是更「適當」的方式來做到這一點。