在路由组中使用“仅”路由过滤器

时间:2014-10-18 17:00:49

标签: laravel laravel-4 laravel-routing

我有一个基本的,比如在Laravel中制作的博客结构。由于保持干净,公众和政府分享控制员的帖子,民意调查等。我通过使用only过滤器进行路由(我猜它是过滤器?)

/*  
    The public can access only index and show ::resource routes
        - domain.tld/posts
        - domain.tld/posts/{id}
        - domain.tld/polls
        - domain.tld/polls/{id}
        - domain.tld/categories
        - domain.tld/categories/{id}
        - domain.tld/tags
        - domain.tld/tags/{id}

*/
Route::resource('posts', 'PortalPostsController', ['only' => ['index', 'show']]);
Route::resource('polls', 'PortalPollsController', ['only' => ['index', 'show']]);
Route::resource('categories', 'PortalCategoriesController', ['only' => ['index', 'show']]);
Route::resource('tags', 'PortalTagsController', ['only' => ['index', 'show']]);

/*
    Administration uses the same PortalSomethingController but can access
    all routes by prefixing administration/ to the URL:

        - domain.tld/administration/posts
        - domain.tld/administration/posts/create
        ... all of other administration/resource('posts') routes

        ... all administration/resource('polls') routes
        ... all administration/resource('categories') routes
        ... all administration/resource('tags') routes
*/
Route::group(['prefix' => 'administration'], function() {
    Route::resource('posts', 'PortalPostsController');
    Route::resource('polls', 'PortalPollsController');
    Route::resource('categories', 'PortalCategoriesController');
    Route::resource('tags', 'PortalTagsController');
});

现在,为了保持干燥,我想避免定义[只有' =>用于限制公共访问的每个Route :: resource上的[' index',' show']]。所以,像这样:

// for public access
Route::group(['only' => ['index', 'show']], function() {
    Route::resource('posts', 'PortalPostsController');
    Route::resource('polls', 'PortallPollsController');
    Route::resource('categories', 'PortallCategoriesController');
    Route::resource('tags', 'PortallTagsController');
}); 

// for admin access
Route::group(['prefix' => 'administration'], function() {
    Route::resource('posts', 'PortalPostController');
    Route::resource('polls', 'PortallPollsController');
    Route::resource('categories', 'PortallCategoriesController');
    Route::resource('tags', 'PortallTagsController');
});

如果可能的话,我该如何做呢?此外,正如您所看到的,公共路径组和管理路由组使用相同的资源(公共区域仅限于某些路由)和相同的控制器,因此是否可以将其干掉更多?例如:

// define shared resources
Route::group(['name' => 'sharedResources'], function() {
    Route::resource('posts', 'PortalPostController');
    Route::resource('polls', 'PortallPollsController');
    Route::resource('categories', 'PortallCategoriesController');
    Route::resource('tags', 'PortallTagsController');
});

// public access
Route::group(['only' => ['index', 'show']], function() {
    // use sharedResources
});

// admin access
Route::group(['prefix' => 'administration'], function() {
    // use sharedResources
});

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以使用通配符作为路由的第一个URI组件,然后该通配符将可供您的控制器使用。这里唯一的问题是,如果通配符是URI的第一个段,则不能使其成为可选的;因此,您还需要为非管理员路由添加一些前缀:

domain.tld/user/posts
domain.tld/admin/posts

如果你这样做,那么你可以设置这样的路由:

Route::pattern('admin', 'admin|user');
Route::resource('{admin?}/posts', 'PortalPostController');
Route::resource('{admin?}/polls', 'PortalPollsController');
...

在您的控制器中,您可以读取$ admin前缀,并在__construct方法中将'index'/'show'限制应用为beforeFilter,如果前缀为'user'。 (为了保持DRY,您可以将此过滤器逻辑放在BaseController中,让PortalControllers扩展BaseController并调用parent::__construct


另一个选项,如果您可以控制服务器的配置,则更好的选择是使用域路由。然后,普通用户将使用domain.tld/postswww.domain.tld/posts访问您的网站,而管理员则会使用admin.domain.tld/posts。您可以捕获主机名的第一部分,然后在Contoller中将only过滤器作为beforeFilter处理(如上所述)。有关此问题的详细介绍,请参阅Dayle Rees在域路由上的代码明亮部分:http://daylerees.com/codebright/advanced-routing