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

时间:2015-09-18 04:56:20

标签: php session laravel 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的缓存等等?

2 个答案:

答案 0 :(得分:0)

正如你所说,横幅并没有经常改变。因此对我来说,我会使用Cache实现它。这样可以提高性能,因为我们只需要一次使用就可以缓存横幅。而对于其余部分,它从Cache而不是Session中检索得更快。

答案 1 :(得分:0)

您是否希望更改代码以更改给定页面的横幅? 我建议改为创建一个“pages”包,其中每个页面路由名称都输入到数据库中。

从那里,您可以从您的页面服务提供商获得Page :: getModel() - &gt; banner_text或类似内容。 该方法将查找与当前路由名称匹配的db结果与db。中的结果。

当触发控制器方法时,您只需调用即可 页:: getBannerText()

该方法将拉出当前路径名称,拉出与该页面相关的页面结果(如果它存在)或创建它(如果它不存在)(简单方法获取所有内容)。您可以将数据库查询结果缓存X小时,天或其他任何内容,以便在其他人拨打电话时,您甚至不需要处理客户端上的任何存储。

这允许您修改db fascet中的值。它是更“适当”的方式。