Я создаю проект, где у меня несколько типов пользователей, например. superadmin, admin, менеджеров и т. д. После аутентификации пользователя система проверяет тип пользователя и отправляет его на соответствующий контроллер. Средство для этого отлично работает.
Поэтому, когда менеджер перейдет на 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 });
Я знаю, что мы можем переименовать маршруты, такие как superadmin / dashboard и admin / dashboard, но мне было интересно, есть ли другой способ достичь чистого маршрута. Кто-нибудь знает какие-либо проблемы вокруг?
BTW Я использую LARAVEL 5.1
Любая помощь приветствуется 🙂
Лучшим решением, которое я могу думать, является создание одного контроллера, который управляет всеми страницами для пользователей.
пример в файле routes.php:
Route::get('dashboard', 'PagesController@dashboard'); Route::get('users', 'PagesController@manageUsers');
ваш файл 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'); } }
Вы можете сделать это с помощью промежуточного программного обеспечения, которое переопределяет namespace
действия, uses
и controller
атрибуты:
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', 'dashboard@index'); Route::get('users', 'manageUsers@index'); });
Среднее программное обеспечение преобразует 'dashboard@index'
в 'Admin\dashboard@index'
или 'SuperAdmin\dashboard@index'
зависимости от атрибута role
текущего пользователя, а также применит промежуточное программное обеспечение для конкретной роли.