Laravel 5:缓存或使用会话来构建一个站点范围的横幅


Laravel 5: To cache or use sessions for building a site-wide banner?

我正在Laravel 5应用程序中构建一个功能,允许您设置将显示在页面顶部的状态横幅的内容。我们将使用这个横幅来显示特定页面的东西(状态信息等)和整个网站的公告(每个用户看到的都是相同的东西,横幅保持不变一段时间)。

现在,我已经通过使用Laravel会话实现了这一点,允许通过从任何控制器或中间件调用helper方法来添加横幅:

    // 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的缓存等?

正如你所说,横幅不会经常改变。因此对我来说,我会使用缓存来实现它。这提高了性能,因为我们只需要一次使用来缓存横幅。对于其余的,它从缓存中检索比Session更快。

您想要更改代码来更改给定页面的横幅吗?我建议创建一个"pages"包,其中每个页面路由名称被输入到数据库中。

从那里,从你的页面服务提供商你得到page::getModel()->banner_text或类似的东西。该方法将在db内查找与当前路由名匹配的db结果。

当一个控制器方法被触发时,你只需调用页面::getBannerText ()

该方法将提取当前路由名称,如果存在则提取与该页相关的页面结果,如果不存在则创建该页(获取所有内容的简单方法)。你缓存数据库查询结果X小时,天或任何时候,当别人打电话时,你甚至不需要处理任何存储在客户端。

允许您修改数据库集的值。这是更"合适"的方式。