繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM