dqh1984 2015-09-18 04:56
浏览 59

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

I'm building a feature into a Laravel 5 app that will allow you to set the content of a status banner that will display across the top of the page. We will be using this banner both to display page-specific things (status messages, etc) and site-wide announcements (every user sees the same thing, banner stays the same for awhile).

Right now, I've implemented this by using Laravel sessions to allow banners to be added by calling a helper method from any controller or middleware:

    // 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 );
    }
}

Banners are created in controllers or middleware like this:

set_banner("<b>Note:</b> This is a sample persistant-scope banner set in a controller", "success", true);

Is there a better way to accomplish storing both page-level and site-wide banners? My concerns is that hitting the session on every pageload may be inefficient, especially for banners that won't be changing for long periods of time. Will this approach mess with Laravel's cache, etc?

  • 写回答

2条回答 默认 最新

  • dongyang7152 2015-09-18 05:10
    关注

    As you said the banners do not change that often. Hence for me i would implement it using Cache. This improves performance since we need only one use to have the banners cached. And for the rest its retrieved faster from the Cache rather Session.

    评论

报告相同问题?