[英]Laravel 5: To cache or use sessions for building a site-wide banner?
我正在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的緩存等混淆嗎?
正如您所說,標語不會經常更改。 因此,對我來說,我將使用緩存來實現它。 由於我們僅需要一次使用即可將橫幅廣告緩存起來,因此可以提高性能。 對於其余部分,可以從Cache而不是Session中更快地進行檢索。
是否要更改代碼以更改給定頁面的標題? 我建議改為創建一個“頁面”包,在其中將每個頁面路線名稱輸入數據庫。
從那里,您的頁面服務提供商會獲得Page :: getModel()-> banner_text或類似的東西。 該方法將查找與當前路由名稱與db中的結果匹配的db結果。
當控制器方法被觸發時,您只需調用Page :: getBannerText()
該方法將提取當前路由名稱,提取與該頁面相關的頁面結果(如果存在)或創建它(如果不存在)(獲取所有內容的簡便方法)。 您將數據庫查詢結果緩存了X個小時,幾天或任何時間,因此無論何時有人打來電話,您甚至都不需要在客戶端上處理任何存儲。
這使您可以從數據庫fascet修改值。 它是更“正確”的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.