首页 文章

laravel过滤组同名路由

提问于
浏览
1

我在我的laravel 4项目中遇到了这个烦人的问题,它有三种类型的用户,即学生,教师和主持人(我使用Entrust作为角色管理解决方案) .

它们中的每一个都可以浏览相同的路径,但是根据用户类型,应该调用另一个方法 . 所以我的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将返回任务作为学生的路线,因为这是最后一次重新定义'showTask'路线,我会得到404错误 .

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

我希望这不是太乱 . 提前致谢!

3 回答

  • 0

    从@Matthias S的答案来看,这有用吗?而不是使用委托过滤器,检查路由的权限,如下所示:

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

    将辅助路由组移出主auth组,然后使用管道命令为每个组运行auth,例如

    Route::group(array('before' => 'auth|teacher'), function(){
    Route::group(array('before' => 'auth|moderator'), function(){
    
  • 1

    我不确定你的方法是否是完成这项工作的好方法 . 我认为两次定义相同的路线并不是一种好的做法,但我不知道这是否属实 .

    解决此问题的一种方法可能是您只定义两条路线,让控制器根据用户的角色决定要执行的操作 . 这不是您问题的直接解决方案,而是处理执行不同控制器操作的不同角色问题的另一种方法 .

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

    只是另一种方法,使您的路线更清洁,并将逻辑放入控制器 .

相关问题