2015-07-12 197 views
9

我正在创建一个项目,我有多个用户类型,例如。超级管理员,管理员,经理等。一旦用户被认证,系统检查用户类型并将他发送到相应的控制器。这个中间件工作正常。单个Laravel路由多个控制器

因此,当经理去http://example.com/dashboard他会看到经理仪表板,而当管理员去了相同的链接,他可以看到管理仪表板。

下面的路线组单独工作很好,但是当放在一起时只有最后一组工作。

/***** Routes.php ****/ 
// SuperAdmin Routes 
    Route::group(['middleware' => 'App\Http\Middleware\SuperAdminMiddleware'], function() { 
     Route::get('dashboard', 'SuperAdmin\[email protected]'); // SuperAdmin Dashboard 
     Route::get('users', 'SuperAdmin\[email protected]'); // SuperAdmin Users 
    }); 

// Admin Routes 
    Route::group(['middleware' => 'App\Http\Middleware\AdminMiddleware'], function() { 
     Route::get('dashboard', 'Admin\[email protected]'); // Admin Dashboard 
     Route::get('users', 'Admin\[email protected]'); // Admin Users 
    }); 

我知道我们可以重命名像超级管理员/仪表板和admin /仪表板的路线,但我想知道是否有任何其他的方式来实现清洁路线。有谁知道任何周围的任何工作?

BTW我使用LARAVEL 5.1

任何帮助表示赞赏:)

+0

当你把它们放在彼此后面时,你只是用第二个覆盖第一个...... – JiFus

+0

不,这不起作用。 – lukasgeiter

回答

3

我能想到的最好的解决方案是创建用于管理用户所有的页面一个控制器。

例如在routes.php文件文件:

Route::get('dashboard', '[email protected]'); 
Route::get('users', '[email protected]'); 

您PagesController.php文件:

protected $user; 

public function __construct() 
{ 
    $this->user = Auth::user(); 
} 

public function dashboard(){ 
    //you have to define 'isSuperAdmin' and 'isAdmin' functions inside your user model or somewhere else 
    if($this->user->isSuperAdmin()){ 
     $controller = app()->make('SuperAdminController'); 
     return $controller->callAction('dashboard');  
    } 
    if($this->user->isAdmin()){ 
     $controller = app()->make('AdminController'); 
     return $controller->callAction('dashboard');  
    } 
} 
public function manageUsers(){ 
    if($this->user->isSuperAdmin()){ 
     $controller = app()->make('SuperAdminController'); 
     return $controller->callAction('manageUsers'); 
    } 
    if($this->user->isAdmin()){ 
     $controller = app()->make('AdminController'); 
     return $controller->callAction('manageUsers'); 
    } 
} 
+0

谢谢你的回复,我试过这样做。但由于某种原因app() - > make('SuperAdminController');给出了SuperAdminController不存在的错误。虽然它确实存在,我也使用该命令来dump-autoload。它的奇怪,但我认为这可能是因为我使用最新版本,它可能不理解make命令。 –

+0

尝试'$ app = app();'然后'$ app-> make()' –

+0

Thankyou,我设法使它以这种方式工作app() - > make('App \ Http \ Controllers \ SuperAdmin \ SuperAdminController' ) - >仪表板(); 一切正常,因为我想。我只关心这是否是从另一个控制器调用方法的好方法? –

5

你可以用做Middleware,它覆盖路由操作的namespaceusescontroller属性之前:

use Closure; 
use Illuminate\Http\Request; 
use Illuminate\Contracts\Container\Container; 
use App\Http\Middleware\AdminMiddleware; 
use App\Http\Middleware\SuperAdminMiddleware; 

class AdminRoutingMiddleware 
{ 
    /** 
    * @var Container 
    */ 
    private $container; 

    public function __construct(Container $container) 
    { 
     $this->container = $container; 
    } 

    private static $ROLES = [ 
     'admin' => [ 
      'namespace' => 'Admin', 
      'middleware' => AdminMiddleware::class, 
     ], 
     'super' => [ 
      'namespace' => 'SuperAdmin', 
      'middleware' => SuperAdminMiddleware::class, 
     ] 
    ]; 

    public function handle(Request $request, Closure $next) 
    { 
     $action = $request->route()->getAction(); 
     $role = static::$ROLES[$request->user()->role]; 

     $namespace = $action['namespace'] . '\\' . $role['namespace']; 

     $action['uses'] = str_replace($action['namespace'], $namespace, $action['uses']); 
     $action['controller'] = str_replace($action['namespace'], $namespace, $action['controller']); 
     $action['namespace'] = $namespace; 

     $request->route()->setAction($action); 

     return $this->container->make($role['middleware'])->handle($request, $next); 
    } 
} 

这种方式,你有没有到最后的命名空间前缀只能注册一次每条路线:

Route::group(['middleware' => 'App\Http\Middleware\AdminRoutingMiddleware'], function() { 
    Route::get('dashboard', '[email protected]'); 
    Route::get('users', '[email protected]'); 
}); 

中间件将'[email protected]'转换为根据当前用户的role属性'Admin\[email protected]''SuperAdmin\[email protected]'以及应用角色特定的中间件。