我正在为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 :(得分:0)
正如你所说,横幅并没有经常改变。因此对我来说,我会使用Cache实现它。这样可以提高性能,因为我们只需要一次使用就可以缓存横幅。而对于其余部分,它从Cache而不是Session中检索得更快。
答案 1 :(得分:0)
您是否希望更改代码以更改给定页面的横幅? 我建议改为创建一个“pages”包,其中每个页面路由名称都输入到数据库中。
从那里,您可以从您的页面服务提供商获得Page :: getModel() - &gt; banner_text或类似内容。 该方法将查找与当前路由名称匹配的db结果与db。中的结果。
当触发控制器方法时,您只需调用即可 页:: getBannerText()
该方法将拉出当前路径名称,拉出与该页面相关的页面结果(如果它存在)或创建它(如果它不存在)(简单方法获取所有内容)。您可以将数据库查询结果缓存X小时,天或其他任何内容,以便在其他人拨打电话时,您甚至不需要处理客户端上的任何存储。
这允许您修改db fascet中的值。它是更“适当”的方式。