Laravel:在缓存中存储导航,但希望根据当前url设置活动类


Laravel : Storing navigation in cache but want to set active class based on current url

我正在使用Laravel的CMS应用程序,我已经存储在缓存中的导航菜单,因为它是从数据库动态生成的,每次导航菜单在数据库中更新,缓存也将更新。

我唯一的问题是,虽然我可以很容易地访问导航菜单,但我想在被访问的页面的链接上设置活动类,这真的让我发疯。

这是我如何在缓存中存储导航

<a href="www.dev.com/home" class="<?php Request::is('home*') ? 'active' : ''; ?>">Home</a>
<a href="www.dev.com/about-us" class="<?php Request::is('about-us*') ? 'active' : ''; ?>">About Us</a>
<a href="www.dev.com/services" class="<?php Request::is('services*') ? 'active' : ''; ?>">Services</a>

这就是我在page.blade.php文件中访问导航的方式{{ Navigation::display_main_menu() }},该函数检查缓存是否存在,如果不存在则创建缓存并返回值。

但是导航显示完全像这个with php tags,而不是与类(我想看到),我甚至尝试改变我如何存储导航到<a href="www.dev.com/home" class="{{ Request::is('home*') ? 'active' : '' }}">Home</a>,但即使这得到完全显示。

在呈现导航时,我能做些什么来执行php代码或blade语法。

请给我指一下正确的方向。如有任何帮助,不胜感激。

您可以在HTML类中add新的macro,只需将其添加到文件(macros.php)中并将其存储在app/start目录中,然后使用require/includeapp/startglobal.php文件中包含它:

HTML::macro('menuItem', function($name, $title = null, $parameters = array(), $attributes = array()){
    $currentUrl = URL::current() == url() ? url('home') : URL::current();
    $active = ( $currentUrl == URL::route($name, $parameters) ) ? ' class="active"':'';
    return '<li'.$active.'>' . HTML::linkRoute($name, $title, $parameters, $attributes) . '</li>';
});

在您的view中,您可以使用如下方式生成菜单项:

<ul>
    {{ HTML::menuItem('page.home', 'Home', array('home')) }}
</ul>

这里page.home是在声明route时分配给/的路由名称,是的,在这种情况下路由应该有name,例如:

Route::get('/', array('uses' => 'PageController@home', 'as' => 'page.home'));

menuItem宏中,第二个参数(Home)是要显示的菜单标题,第三个参数是可选参数(如果有的话)。例如,你的About Us页面的参数是about-us要创建菜单项你可以这样写:

{{ HTML::menuItem('page.about', 'About Us', array('about-us')) }}

这是一个可能的解决方案,也许还有其他方法。