php - php Laravel 过滤器组路由具有相同名称

  显示原文与译文双语对照的内容
95 4

我在 Laravel 4项目中遇到了这个烦人的问题,有三种类型的用户,老师和主持人( 。我使用委托作为角色管理解决方案) 。

每一个都可以浏览相同的路由,但是根据用户类型,应该调用另一个方法。因此,我的route.php 文件结构如下:

Route::group(array('before' => 'auth'), function(){
Route::group(array('before' => 'teacher'), function(){
 Route::get('/tasks',array('as'=>'tasks','uses'=>'TasksController@tasksAsTeacher'));
 Route::get('/task/{id}',array('as'=>'showTask','uses'=>'TasksController@showTaskAsTeacher'));
});
Route::group(array('before' => 'moderator'), function(){
 Route::get('/tasks',array('as'=>'tasks','uses'=>'TasksController@tasksAsModerator'));
 Route::get('/task/{id}',array('as'=>'showTask','uses'=>'TasksController@showTaskAsModerator'));
}); 
Route::group(array('before' => 'student'), function(){
 Route::get('/tasks',array('as'=>'tasks','uses'=>'TasksController@tasksAsStudent'));
 Route::get('/task/{id}',array('as'=>'showTask','uses'=>'TasksController@showTaskAsStudent'));
});
});

但是,使用教师或者版主帐户浏览这些路由总是返回 404个错误。我发现这是因为另外两个过滤器组的路线被重新定义了。

因此,如果我把教师用户重定向到'showtask',Laravel 将返回任务作为学生的路线,因为这是最后一次重新定义路径,我会得到一个错误。

我现在的问题是:处理这个错误的最佳方法是什么?

我希望这不会太混乱。提前致谢!

时间:原作者:0个回答

57 4

从 @Matthias的回答,这是否工作?不要使用委托过滤器,请检查以下路由的权限:

//routes.php
 if(Entrust::hasRole('teacher')) {
 Route::get('/tasks',array('as'=>'tasks','uses'=>'TasksController@tasksAsTeacher'));
 Route::get('/task/{id}',array('as'=>'showTask','uses'=>'TasksController@showTaskAsTeacher'));
 }

针对不同角色重复

编辑:也如果你拥有存储在会话中的用户的角色,你可以以使用类似于这样的自动路由:

//routes.php
 if(Entrust::hasRole(Session::get('role'))) {
 Route::get('/tasks',array('as'=>'tasks','uses'=>'TasksController@tasksAs'.Session::get('role')));
 Route::get('/task/{id}',array('as'=>'showTask','uses'=>'TasksController@showTaskAs'.Session::get('role')));
 }

这样,你就可以添加任意多的角色,只要你为角色添加了正确的控制器函数。

编辑 #2:

或者我更觉得

//routes.php - UPDATED, verify role inside controller instead of defining routes based on role
 Route::get('/tasks',array('as'=>'tasks','uses'=>'TasksController@tasks'));
 Route::get('/task/{id}',array('as'=>'showTask','uses'=>'TasksController@showTask'));
//TasksController.php
public function __construct(){
 if(!Session::get('role')){//Make sure the user has a role assigned
 return Redirect::to('login');//Redirect to login or permission screen if not
 }
}
public function tasks(){
 if(Entrust::hasRole(Session::get('role')){
 $tasks = Tasks::where('role_id', '=', $role->id);//Get tasks based on role
 View::make('tasks.index')->with('tasks', $tasks);
 } else{
//Show permissions error for user
 }
}
public function showTask($task_id){
 if(Entrust::hasRole(Session::get('role')){
 $task = Tasks::where('role_id', '=', $role->id)->where('id', '=', $task_id)->first();
 View::make('tasks.view')->with('task', $task);
 }
}
原作者:
93 5

将辅助路由组移出主身份验证组,然后使用管道命令在每个组 e.g. 之前运行身份验证

Route::group(array('before' => 'auth|teacher'), function(){
Route::group(array('before' => 'auth|moderator'), function(){
原作者:
104 0

我不确定你的方法是不是一个好方法。我认为定义相同的路线两次不是好的实践,但是我不知道这是 true 。

解决这一问题的一种方法是只定义两个路由,并让控制器根据用户的角色决定执行哪个操作。这不是解决问题的直接解决方案,而是处理不同角色执行不同控制器操作的问题的另一种方法。

Route::group(array('before' => 'auth'), function(){
 Route::get('/tasks',array('as'=>'tasks','uses'=>'TasksController@tasks'));
 Route::get('/task/{id}',array('as'=>'showTask','uses'=>'TasksController@showTask'));
});

然后在TasksController中,让方法任务和showTask类似于这样

class TasksController extends BaseController {
 public function tasks() {
 if(Entrust::hasRole('teacher')) {
 return $this->tasksAsTeacher();
 } else if(Entrust::hasRole('moderator')) {
 return $this->tasksAsModerator();
 } else if(Entrust::hasRole('student')) {
 return $this->tasksAsStudent();
 }
 }
 public function showTask($id) {
 if(Entrust::hasRole('teacher')) {
 return $this->showTaskAsTeacher($id);
 } else if(Entrust::hasRole('moderator')) {
 return $this->showTaskAsModerator($id);
 } else if(Entrust::hasRole('student')) {
 return $this->showTaskAsStudent($id);
 }
 }
}

只是另一种方法,使你的路由清洗器,并将逻辑放入控制器。

原作者:
...