Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5:缓存或使用会话来构建站点范围的横幅?_Php_Session_Laravel_Laravel 5 - Fatal编程技术网

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

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)

我正在为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(用于永久性横幅)
函数集\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中的值。这是更“恰当”的方法