简体   繁体   English

单个Laravel路由,用于多个控制器

[英]Single Laravel Route for multiple controllers

I am creating a project where i have multiple user types, eg. 我正在创建一个项目,我有多种用户类型,例如。 superadmin, admin, managers etc. Once the user is authenticated, the system checks the user type and sends him to the respective controller. superadmin,admin,managers等。一旦用户通过身份验证,系统将检查用户类型并将其发送到相应的控制器。 The middle ware for this is working fine. 中间件的工作正常。

So when manager goes to http://example.com/dashboard he will see the managers dashboard while when admin goes to the same link he can see the admin dashboard. 因此,当经理访问http://example.com/dashboard时,他会看到管理员信息中心,而当管理员转到相同的链接时,他可以看到管理信息中心。

The below route groups work fine individually but when placed together only the last one works. 以下路线组可单独工作,但放在一起时只有最后一个工作。

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

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

I know we can rename the routes like superadmin/dashboard and admin/dashboard but i was wondering if there is any other way to achieve the clean route. 我知道我们可以重命名路线,如superadmin / dashboard和admin / dashboard,但我想知道是否有其他方法可以实现清洁路线。 Does anyone know of any anywork arounds ? 有没有人知道任何任何工作?

BTW i am using LARAVEL 5.1 顺便说一句,我正在使用LARAVEL 5.1

Any help is appreciated :) 任何帮助表示赞赏:)

You can do this with a Before Middleware that overrides the route action's namespace , uses and controller attributes: 您可以使用覆盖路由操作的namespaceusescontroller属性的Before Middleware来执行此操作:

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

This way you have to register each route only once without the final namespace prefix: 这样,您只需在没有最终名称空间前缀的情况下注册每个路由一次:

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

The middleware will convert 'dashboard@index' to 'Admin\\dashboard@index' or 'SuperAdmin\\dashboard@index' depending on current user's role attribute as well as apply the role specific middleware. 中间件会根据当前用户的role属性将'dashboard@index'转换为'Admin\\dashboard@index''SuperAdmin\\dashboard@index' ,并应用角色特定的中间件。

The best solution I can think is to create one controller that manages all the pages for the users. 我能想到的最佳解决方案是创建一个控制器来管理用户的所有页面。

example in routes.php file: routes.php文件中的示例:

Route::get('dashboard', 'PagesController@dashboard');
Route::get('users', 'PagesController@manageUsers');

your PagesController.php file: 你的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');  
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM