2015-07-12 2 views
9

Я создаю проект, в котором у меня есть несколько типов пользователей, например. superadmin, admin, менеджеров и т. д. После аутентификации пользователя система проверяет тип пользователя и отправляет его на соответствующий контроллер. Средство для этого отлично работает.Single Laravel Route для нескольких контроллеров

Итак, когда менеджер отправляется в 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 
    }); 

Я знаю, что мы можем переименовать маршруты, как SuperAdmin/приборную панель и администратор/приборную панель, но мне было интересно, есть ли другой способ достичь чистого маршрута. Кто-нибудь знает какие-либо проблемы вокруг?

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. Его wierd, но я думаю, что это может быть потому, что я использую последнюю версию, и это может не понять команду make. –

+0

Попробуйте '$ app = app();' then '$ app-> make()' –

+0

Спасибо, мне удалось заставить его работать так: app() -> make ('App \ Http \ Controllers \ SuperAdmin \ SuperAdminController') -> панель(); Все работает так, как я хотел. Меня просто беспокоит, что это хороший способ вызвать методы с другого контроллера? –

5

Вы можете сделать это с Перед Middleware, отменяющий 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', '[email protected]'); 
    Route::get('users', '[email protected]'); 
}); 

Промежуточных преобразуют '[email protected]' в 'Admin\[email protected]' или 'SuperAdmin\[email protected]' в зависимости от текущего пользователя role атрибутов, а также применять работайте роль конкретной Middleware.

Смежные вопросы