在Laravel 5中通过Route :: group构建菜单

时间:2015-11-18 18:05:35

标签: laravel laravel-5

我有2 Route::group,每个人都有routes两个。例如:

Route::group(['prefix'=>'/guest', 'middleware'=>'guest'], function()
{
    Route::get('login', ['as' => 'Login to the site', 'uses' => 'WelcomeController@login']);
    Route::get('register', ['as' => 'Register', 'uses' => 'WelcomeController@register']);
    Route::get('restore', ['as' => 'Restore the password', 'uses' => 'WelcomeController@restore']);
});


Route::group(['prefix'=>'/admin', 'middleware'=>'auth', function()
{
    Route::get('/dashboard', ['as' => 'Home Page', 'uses' => 'AdminController@users']);
    Route::get('/users', ['as' => 'Users', 'uses' => 'AdminController@users']);
});

所以,我想自动使用当前前缀Route::group来构建菜单。如果用户通过身份验证,Laravel应显示如下菜单列表:

<li><a href="/admin/dashboard">Home Page</a></li>
<li><a href="/admin/users">Users</a></li>

但如果用户只是访客,在这种情况下我的菜单应该是这样的:

<li><a href="/guest/login">Login to the site</a></li>
<li><a href="/guest/register">Register</a></li>

如果您查看第二个访客菜单,您会看到错过了menu for Restoring password。是的,我希望有时候不显示一些菜单。

基本上,我有两个问题:

  1. 找到属于当前Route组的路由并构建一个 菜单。
  2. 不要在菜单中显示任何路线,为它们添加一些选项。

2 个答案:

答案 0 :(得分:3)

路由组是暂时的,它们唯一的用途是允许路由器批量填充其中路由的特定属性(前缀,名称空间等)。

注册组时,传递给它的属性将添加到组内定义的路由中,然后删除该组。因此,只有在执行-Dhttp.port=8888方法时,该组才存在于路由器中。

这意味着你不能在路由闭包或控制器方法中获取任何组信息,以便获取路径。

由于您说您有3种类型的用户,因此您应该有办法获取经过身份验证的用户的用户类型,例如Route::group(将返回其中一个值{{1} },Auth::user()->typeadmin)。此外,您应该能够使用instructor来确定用户是否未登录。

因此,您可以执行以下操作来处理菜单生成(下面的代码假定student变量包含Auth::guest()中的模型):

$user

答案 1 :(得分:1)

我在别名中为我想要隐藏的一些路线添加了“@”。

Route::group(['prefix'=>'/guest', 'middleware'=>'guest'], function()
{
    Route::get('login', ['as' => 'Login to the site', 'uses' => 'WelcomeController@login']);
    Route::get('register', ['as' => 'Register', 'uses' => 'WelcomeController@register']);
    Route::get('restore', ['as' => 'Restore the password@hide', 'uses' => 'WelcomeController@restore']);
});

然后在视图中我添加了这段代码:

foreach( Route::getRoutes() as $route){
    $data = explode('@', $route->getName());

    if(Route::getCurrentRoute()->getPrefix() == $route->getPrefix() && @$data[1] == "" ){
        echo '<li><a href="'.$route->getPath() .'">'.$data[0].'</a></li>';
    }
}

现在,我成功显示了当前route::group的所有路由器,并隐藏了一些将@添加到别名的路由。例如,它是Restore the password@hide