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