Laravel 在路由组中使用“仅”路由筛选器

Laravel 在路由组中使用“仅”路由筛选器,laravel,laravel-4,laravel-routing,Laravel,Laravel 4,Laravel Routing,我有一个基本的博客结构,比如说,是用Laravel制作的。因为保持事情干爽,公众和政府分享了帖子、民意调查等的控制权。我通过使用唯一的过滤器来实现这一点,我想这是一个过滤器 /* The public can access only index and show ::resource routes - domain.tld/posts - domain.tld/posts/{id} - domain.tld/polls

我有一个基本的博客结构,比如说,是用Laravel制作的。因为保持事情干爽,公众和政府分享了帖子、民意调查等的控制权。我通过使用唯一的过滤器来实现这一点,我想这是一个过滤器

/*  
    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');
});
现在,为了保持干爽,我希望避免在每个路由上定义['only'=>['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');
});
如果可能的话,我该怎么做呢?此外,正如您所看到的,public和admin路由组都使用相同的资源,而public仅限于某些路由和相同的控制器,因此是否有可能使其更加枯竭?例如:

// 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
});

提前谢谢

您可以使用通配符作为路由的第一个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前缀,并将'index'/'show'限制应用为_构造方法中的beforeFilter(如果前缀为'user')。为了保持干爽,您可以将此筛选器逻辑放入BaseController中,并让PortalController扩展BaseController并调用parent::\u构造

另一个选择是使用域路由,如果您可以控制服务器的配置,那么这是一个更好的选择。然后,普通用户将使用domain.tld/posts或www.domain.tld/posts访问您的站点,而管理员将使用admin.domain.tld/posts。您可以捕获主机名的第一部分,然后将唯一的筛选器作为控制器中的beforeFilter进行处理,如上所述。有关这方面的详细讨论,请参阅Dayle Rees的域路由代码: