Laravel 访问控制器根据用户组使用不同的路由
Laravel access controllers using different routes depending on user group
我目前有一个 booker
和 admin
个用户组。 booker
个用户分配给 1 个 event
,admin
个用户未分配给任何事件。
两个用户组都有这样的路由组:
Route::group(['middleware' => 'booker'], function() {
Route::controller('event', 'EventController');
});
Route::group(['middleware' => 'admin'], function() {
Route::controller('admin', 'AdminController');
});
EventController
中的动作是这样的:
getIndex /event
getOverview /event/overview
postOverview /event/overview
getFacilities /event/facilities
postFacilties /event/facilities
etc.
当以 admin
用户组登录时,我是否可以对这样的路由使用 EventController
操作:
/admin/events/1
/admin/events/1/overview
/admin/events/1/facilties
/admin/events/1/schedule
etc.
在这里,我不是从用户那里获取 event
id,而是从 URL 获取它。
谢谢
好的,我设法到达那里,虽然它很乱所以我仍然很想知道是否有更好的解决方案:
路线:
Route::group(['middleware' => 'booker'], function() {
Route::controller('event', 'EventController');
});
Route::group(['middleware' => 'admin'], function() {
Route::controller('admin/events/{id?}', 'EventController');
Route::controller('admin', 'AdminController');
Route::get('event', function() { return redirect('admin'); });
});
在事件控制器中(使用哨兵):
public function __construct()
{
$user = Sentry::getUser();
if($user->hasAccess('admin')) {
$id = Request::segment(3);
$event = Event::find($id);
if(!$event) {
abort(404);
}
} else {
$event = $user->event;
}
$this->data['event'] = $event;
}
public function getIndex()
{
return view('event.index', $this->data);
}
正如您所见,我不得不使用 URL 段作为 id,因为我找不到在路由中传递 id 变量的方法。路由变量只是让我忽略 id 并加载控制器。
我发现我不能在 EventController 视图中使用这样的 URLs:
<a href="{{ URL::action('EventController@getOverview') }}">Overview<a>
// /event/overview
// /admin/events//overview
但是使用其他助手我可以破解它:
<a href="{{ URL::full().'/overview' }}">Overview<a>
// /event/overview
// /admin/events/3/overview
我目前有一个 booker
和 admin
个用户组。 booker
个用户分配给 1 个 event
,admin
个用户未分配给任何事件。
两个用户组都有这样的路由组:
Route::group(['middleware' => 'booker'], function() {
Route::controller('event', 'EventController');
});
Route::group(['middleware' => 'admin'], function() {
Route::controller('admin', 'AdminController');
});
EventController
中的动作是这样的:
getIndex /event
getOverview /event/overview
postOverview /event/overview
getFacilities /event/facilities
postFacilties /event/facilities
etc.
当以 admin
用户组登录时,我是否可以对这样的路由使用 EventController
操作:
/admin/events/1
/admin/events/1/overview
/admin/events/1/facilties
/admin/events/1/schedule
etc.
在这里,我不是从用户那里获取 event
id,而是从 URL 获取它。
谢谢
好的,我设法到达那里,虽然它很乱所以我仍然很想知道是否有更好的解决方案:
路线:
Route::group(['middleware' => 'booker'], function() {
Route::controller('event', 'EventController');
});
Route::group(['middleware' => 'admin'], function() {
Route::controller('admin/events/{id?}', 'EventController');
Route::controller('admin', 'AdminController');
Route::get('event', function() { return redirect('admin'); });
});
在事件控制器中(使用哨兵):
public function __construct()
{
$user = Sentry::getUser();
if($user->hasAccess('admin')) {
$id = Request::segment(3);
$event = Event::find($id);
if(!$event) {
abort(404);
}
} else {
$event = $user->event;
}
$this->data['event'] = $event;
}
public function getIndex()
{
return view('event.index', $this->data);
}
正如您所见,我不得不使用 URL 段作为 id,因为我找不到在路由中传递 id 变量的方法。路由变量只是让我忽略 id 并加载控制器。
我发现我不能在 EventController 视图中使用这样的 URLs:
<a href="{{ URL::action('EventController@getOverview') }}">Overview<a>
// /event/overview
// /admin/events//overview
但是使用其他助手我可以破解它:
<a href="{{ URL::full().'/overview' }}">Overview<a>
// /event/overview
// /admin/events/3/overview