Laravel 5.3:当请求与URL(使用语言)匹配时,如何将导航菜单标记为活动

时间:2016-12-19 21:23:39

标签: laravel-5 locale multilingual

当网址与请求匹配时,我想将导航菜单标记为“有效”。

这很好用:

    <div class="sidebar">
            <ul class="sidebar-menu">
                    <li {{{ (Request::is('en/dashboard') ? 'class=active' : '') }}}>
                            <a href="/{{ App::getLocale() }}/dashboard">
                                    <i class="fa fa-dashboard"></i> <span>{{ trans('sidebar.dashboard') }}</span>
                            </a>
                    </li>

                    <li {{{ (Request::is('en/settings') ? 'class=active' : '') }}}>
                            <a href="/{{ App::getLocale() }}/settings">
                                    <i class="fa fa-gears"></i> <span>{{ trans('sidebar.settings') }}</span>
                            </a>
                    </li>
            </ul>
    </div>

不幸的是,当URL使用语言代码“en”时,它只能工作并标记导航菜单。但是,如何用更动态的东西替换静态字符串“en”?

我已经尝试使用此代码解决此问题,但它不起作用:

    <li {{{ (Request::is('{{ App::getLocale() }}/dashboard') ? 'class=active' : '') }}}>

解决这个问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:3)

我现在正在使用这种解决方案,它可以很好地保持刀片清洁。

首先,在/cdn-cgi/l/email-protection#中为每条路线指定一个唯一的名称:

routes/web.php

在导航刀片中(例如 <?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/admin/dashboard', 'DashboardController@getAll')->name('dashboard'); Route::get('/admin/maintenances', 'MaintenanceController@get')->name('maintenances-overview'); Route::get('/admin/users', 'UserController@getUsers')->name('users-overview'); ),您现在可以简单地引用这些名称:

resources/views/layouts/admin/navbar.blade.php

当您使用多语言网站时,此解决方案也非常有用,因为您现在不必使用正则表达式来确定它是否匹配。您还可以编辑和更新您想要的路径URL,而无需更新所有刀片,只是因为URL已更改。 <li class="{{ Route::currentRouteName() == 'dashboard' ? 'active' : '' }}"> <a href="{{ route('dashboard') }}">Dashboard</a> </li> <li class="{{ Route::currentRouteName() == 'maintenances-overview' ? 'active' : '' }}"> <a href="{{ route('maintenances-overview') }}">Maintenances</a> </li> <li class="{{ Route::currentRouteName() == 'users-overview' ? 'active' : '' }}"> <a href="{{ route('users-overview') }}">Users</a> </li> 函数返回autom。更新的URL和route()函数始终返回路由的设置名称。 :)

就像提示多语言网站一样:您只需使用语言变量替换静态文本Route::currentRouteName()

Users

有关本地化的更多信息,请查看laravel.com localization documentation

答案 1 :(得分:1)

通常,我有一个布局,当前视图扩展了这些导航项,如下所示:

<li><a href="{{ url("home") }}>Home</a></li>
<li><a href="{{ url("about") }}>About</a></li>
<li><a href="{{ url("contact") }}>Contact</a></li>

然后我的路线:

Route::get("/home", "BasicController@getHome");

然后在我的控制器中:

public function getHome(){
    return view("home")->with(["page" => "home"]);
}

现在,我的观看次数home.blade.php已将$page传递给它,并且因为它使用导航部分(通常为.blade或其他内容)扩展了@extends("layouts.master")文件可以针对这些导航项访问和检查$page变量:

<li class="{{ $page == "home" ? "active" : "" }}><a href="{{ url("/home") }}>Home</a></li>

这样您就不必担心将多种语言的路由与其活动页面匹配。唯一的缺点是您需要在每个控制器中包含一个->with(["page" => "whatever"]),它返回一个扩展该导航布局的视图。可能有一种更简单的方法来实现这一目标,但这应该会给你一个开始。

答案 2 :(得分:0)

很简单。只需在包含标题或导航栏和链接的文件中执行以下操作:

<li class="{{ (Request::path()=='nameofyourfile' ? 'active' : '') }}">
 <a href="{{ route('nameofyourfile') }}">
                        <span class="icon fa fa-building-o" aria-hidden="true"></span><span class="title">nameofyourfile</span>
                                                </a></li>

答案 3 :(得分:0)

将这个小函数代码放在助手类

function is_current_route($route){
    return Route::currentRouteName() == $route ? 'class=active' : '';
}

在你的观点中使用它

<li {{is_current_route('your-route-name-here')}}>
<a href="{{ url("/home") }}>Home</a>
</li>