我有一个基本的,比如在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
});
提前致谢!
答案 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/posts
或www.domain.tld/posts
访问您的网站,而管理员则会使用admin.domain.tld/posts
。您可以捕获主机名的第一部分,然后在Contoller中将only
过滤器作为beforeFilter处理(如上所述)。有关此问题的详细介绍,请参阅Dayle Rees在域路由上的代码明亮部分:http://daylerees.com/codebright/advanced-routing。