php - 用于多个 Controller 的单一 Laravel 路由

标签 php laravel laravel-5 laravel-routing

我正在创建一个项目,其中有多种用户类型,例如。 super 管理员、管理员、经理等。一旦用户通过身份验证,系统将检查用户类型并将其发送到相应的 Controller 。中间件工作正常。

所以当经理转到 http://example.com/dashboard 时他将看到经理仪表板,而当管理员转到同一链接时,他可以看到管理仪表板。

下面的路由组单独工作正常,但放在一起时只有最后一个有效。

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

我知道我们可以重命名 super 管理员/仪表板和管理/仪表板等路线,但我想知道是否有其他方法可以实现干净的路线。有谁知道任何解决方法吗?

顺便说一句,我正在使用 LARAVEL 5.1

感谢任何帮助:)

最佳答案

您可以使用 Before 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);
    }
}

这样,您只需注册每个路由一次,而无需最终 namespace 前缀:

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

中间件会将 'dashboard@index' 转换为 'Admin\dashboard@index''SuperAdmin\dashboard@index',具体取决于当前用户的 role 属性并应用特定于角色的中间件。

关于php - 用于多个 Controller 的单一 Laravel 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31368433/

相关文章:

php - 将自定义元数据插入数据库

php - 如何使用 PHP 在网站上显示 Facebook 状态提要? (类似于推特提要)

php - 如何获取多个查询的连接数?

php - Laravel 从 Controller 文件中的集合创建数组

php - PostgreSQL:唯一违反:7 错误:重复键值违反唯一约束 "users_pkey"

php - Laravel 5 中如何获取一篇文章的 user_id ?

php - 如果列不匹配,则从多个表中选择连接返回 null

php - 使用 php 在 strip 中创建托管帐户时如何提供外部帐户参数?

javascript - 为什么这个 SFTP 下载这么慢?

php - 为什么 Laravel 广播事件总是使用 "laravel_database_channel" channel 以及如何更改它?