【问题标题】:Laravel Detect Route Group in ViewLaravel 检测视图中的路由组
【发布时间】:2015-02-23 18:33:13
【问题描述】:

在我的管理页面中,我想使用 AngularJS 管理我的电子商务产品。

例如admin/product 将查询 admin/api/product 中的 api

我还没有设置用户身份验证,所以我还不知道用户是否是管理员用户。

我只希望在管理页面上包含 angularjs 管理脚本。

只有当路由组是管理员时,有没有一种方法可以在我的视图中包含有角度的 adminapp.js。例如对于面向公众的页面,我不会将 adminapp.js 公开给面向公众的页面。

我知道如果用户被认证为管理员,我可以这样做 - 但如果路由组是管理员,我希望能够这样做。

Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() {
    Route::group(['prefix' => 'api', 'namespace' => 'Api'], function() {
        Route::resource('product', 'ProductController');
    });

    Route::group(['namespace' => 'Product'], function() {
        Route::get('product', 'ProductController');
    });
});

templates.master.blade.php 中类似:

@if($routeGroupIsAdmin)
    {{ HTML::script('js/adminapp.js') }}
@endif

甚至:

{{ Route::getCurrentRoute()->getPrefix() == 'admin'? HTML::script('js/adminapp.js') : HTML::script('js/app.js') }}

但上面示例的问题是,如果我处于深层嵌套视图中:admin/categories/products,那么我的前缀将不再是 admin。我不想继续使用正则表达式来检测路由前缀中的单词admin

【问题讨论】:

    标签: php angularjs laravel


    【解决方案1】:

    您可以使用路段。

    如果您的组前缀是“admin”并且 URL 看起来像这样http://example.com/admin/home, 您可以使用Request::segment(1) 在刀片上进行检查。它呈现 URL 的第一段。

    @if(Request::segment(1) == 'admin')
       {{HTML::script('js/adminapp.js')}}
    @endif
    

    如果您正在检查另一个段,只需更改索引即可。

    【讨论】:

    • 非常感谢。谢谢萨汉
    • 也可以像request()->segment(1) == 'admin'那样做
    【解决方案2】:

    据我所知,没有内置的方法,但这里有一些可行的方法:

    首先,添加一个路由过滤器

    Route::filter('set-route-group', function($route, $request, $value){
        View::share('routeGroup', $value);
    });
    

    然后将此添加到您的管理员组(您将来也可以将其用于其他组):

    Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'before' => 'set-route-group:admin'], function(){
    

    还要在routes 文件的顶部添加这个,以确保始终设置$routeGroup 变量:

    View::share('routeGroup', null);
    

    那么在你看来:

    @if($routeGroup == 'admin')
        {{ HTML::script('js/adminapp.js') }}
    @endif
    

    【讨论】:

    • 完美 - 我做了一个小的变化:Routes.php 'before' => 'admin' filter applied Filters.php Route::filter('admin', function() { View::share('isGroupAdmin', true); }); templates.master.php {{ isset($isGroupAdmin) ? HTML::script('js/adminapp.js') : HTML::script('js/app.js') }} 这样,当我建立身份验证组件,我可以将身份验证逻辑添加到此管理过滤器
    • 当然也可以。我提出的解决方案的优点是它更通用,并且可以与多个路由组一起使用(我记住,也许这篇文章的未来访问者可能需要它)。还有一件事,考虑更改过滤器的名称。通常一个名为 admin 的前置过滤器建议过滤器以某种方式检查用户是否具有管理员权限。
    猜你喜欢
    • 2017-09-28
    • 2017-09-18
    • 2017-04-06
    • 2014-10-13
    • 2013-04-24
    • 2021-03-22
    • 1970-01-01
    • 2017-01-23
    • 2015-03-03
    相关资源
    最近更新 更多