Php Laravel 5:缓存或使用会话来构建站点范围的横幅?
我正在为Laravel 5应用程序构建一个功能,允许您设置状态横幅的内容,该横幅将显示在页面顶部。我们将使用此横幅来显示页面特定的内容(状态消息等)和站点范围的公告(每个用户都看到相同的内容,横幅在一段时间内保持不变) 现在,我已经通过使用Laravel会话实现了这一点,允许通过从任何控制器或中间件调用helper方法来添加横幅:Php Laravel 5:缓存或使用会话来构建站点范围的横幅?,php,session,laravel,laravel-5,Php,Session,Laravel,Laravel 5,我正在为Laravel 5应用程序构建一个功能,允许您设置状态横幅的内容,该横幅将显示在页面顶部。我们将使用此横幅来显示页面特定的内容(状态消息等)和站点范围的公告(每个用户都看到相同的内容,横幅在一段时间内保持不变) 现在,我已经通过使用Laravel会话实现了这一点,允许通过从任何控制器或中间件调用helper方法来添加横幅: // Call set_banner from in a controller or middleware (for persistent banners)
// 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(用于永久性横幅)
函数集\u banner($banner\u text、$banner\u class、$banner\u persistant=false、$replace=false)
{
$banners=session()->get('banners',[]);
//创建新横幅
$banner=[
“文本”=>$banner\u文本,
'type'=>$banner\u类,
“persistent”=>$banner\u persistent
];
//只有当横幅不存在时,才将其放入阵列中
如果(!in_数组($banner,$banner)){
//覆盖现有横幅或添加到队列
if(!$replace)session()->push('banner',$banner);
else session()->put('banner',[$banner]);
}
}
//默认情况下在master.blade.php模板中调用
函数get_banners()
{
$banners=session()->pull('banners',Array());
foreach($banner作为$banner){
//打印每个横幅
打印“”;
打印$banner['text'];
打印“”;
//如果横幅标记为持久,则推回会话
if($banner['persistent'])session()->push('banner',$banner);
}
}
在控制器或中间件中创建横幅,如下所示:
set_banner("<b>Note:</b> This is a sample persistant-scope banner set in a controller", "success", true);
set_横幅(“注意:这是控制器中设置的示例持久作用域横幅”,“成功”,true);
有没有更好的方法来存储页面级和站点范围的横幅?我担心的是,在每次页面加载时点击会话可能效率低下,尤其是对于长时间内不会改变的横幅。这种方法会弄乱Laravel的缓存等吗?正如您所说,横幅不会经常更改。因此,对于我来说,我将使用缓存实现它。这提高了性能,因为我们只需要一次使用就可以缓存横幅。对于其余的部分,它从缓存而不是会话中检索得更快。正如您所说,横幅不会经常更改。因此,对于我来说,我将使用缓存实现它。这提高了性能,因为我们只需要一次使用就可以缓存横幅。对于其余部分,从缓存而不是会话中检索它的速度更快。是否需要更改代码来更改给定页面的标题? 我建议创建一个“pages”包,将每个页面路由名称输入数据库 从那里,您可以从页面服务提供商处获得page::getModel()->横幅文本或类似内容。 该方法将查找与当前路由名称匹配的db结果和db中的结果 当控制器方法被触发时,您只需调用 页面::getBannerText() 该方法将提取当前路由名称,如果该页面存在,则提取与该页面相关的页面结果,如果该页面不存在,则创建该页面(获取所有内容的简单方法)。您将db查询结果缓存X小时、几天或其他任何时间,因此,无论何时其他人打电话,您甚至不需要处理客户端的任何存储
这允许您修改db fascet中的值。这是更“正确”的方法。您是否希望必须更改代码才能更改给定页面的标题? 我建议创建一个“pages”包,将每个页面路由名称输入数据库 从那里,您可以从页面服务提供商处获得page::getModel()->横幅文本或类似内容。 该方法将查找与当前路由名称匹配的db结果和db中的结果 当控制器方法被触发时,您只需调用 页面::getBannerText() 该方法将提取当前路由名称,如果该页面存在,则提取与该页面相关的页面结果,如果该页面不存在,则创建该页面(获取所有内容的简单方法)。您将db查询结果缓存X小时、几天或其他任何时间,因此,无论何时其他人打电话,您甚至不需要处理客户端的任何存储 这允许您修改db fascet中的值。这是更“恰当”的方法