2015-02-05 3 views
1

Предположим, у меня есть разные пользователи, у которых есть доступ к некоторым страницам. Страницы почти одинаковы, но с небольшими изменениями, например, кнопка удаления не отображается для пользователя, а для администратора .. и так далее.Один контроллер для разных пользователей Laravel

Если у меня есть контроллер под названием DashboardController, у которого есть индекс метода, который показывает некоторую информацию, относящуюся к типу пользователя.

У меня есть два подхода, один, чтобы сделать различные контроллеры, как:

Admin\DashboardController 
User\DashboardController 

но мои маршруты будут как: localhost/admin/dashboard и localhost/user/dashboard

и другой подход, чтобы сделать один контроллер под названием DashboardController и проверьте тип пользователя там.

Итак, какой подход лучше, и есть ли лучший подход, чтобы сделать один URL вместо его префикса?

+1

Определенно сделайте его одним контроллером, если у вас нет логики контроллера, которая отличается от них. И используйте только один вид из них - тогда просто выполните простое '@if (условие администратора)', чтобы показать дополнительные кнопки и т. Д. –

ответ

0

Я предлагаю взглянуть на мнение композиторов: http://laravel.com/docs/4.2/responses#view-composers

Посмотреть композиторы дают возможность связать дополнительную логику представления. Это может привести к удалению некоторого двойного кода или в вашем случае может подтвердить аутентифицированный пользователь и привязать логическое представление к представлению.

Быстрый пример:

// DashboardComposer.php 

class DashboardComposer { 

    public function compose($view) 
    { 
     $user = Auth::user(); 

     $isAdmin = $user->admin; // The attribute 'admin' would be a boolean. 

     $view->with(
      'showDelete', 
      $isAdmin 
     ); 
    } 

} 

На ваш взгляд лезвия вы бы проверить для этого состояния:

// dashboard.blade.php 

@if($isAdmin) 
    <button>Delete</button> 
@endif 

Пожалуйста, обратите внимание, что это не защищает «удалить» конечную точку! Добавление фильтра до этого маршрута должно быть достаточным.

// routes.php 

Route::delete('resource', [ 
    'as' => 'resource.delete', 
    'uses' => '[email protected]', 
    'before' => 'admin' // This would call a custom filter. 
]); 

И, наконец, пользовательский фильтр почти будет выглядеть так же, как композитор представления.

// filters.php 

Route::filter('admin', function() { 
    $user = Auth::user(); 

    return $user->admin; // The attribute 'admin' would be a boolean. 
}); 

последнее замечание я поместил вид композитора в отдельном классе, при этом я могу лучше организовать свой код. Фильтр помещается в тот же файл, что и все другие фильтры, однако можно сделать то же самое, что и с композитором: http://laravel.com/docs/4.2/routing#route-filters

Взгляните на «Фильтрующие классы».

+0

Вышеупомянутое написано с использованием формата Laravel 4. Laravel 5 использует ServiceProviders для регистрации большинства этих действий. –

0

Я решил эту проблему, как следующим образом

routes.php

Route::get('dashboard', ['middleware' => 'auth', 'uses' => '[email protected]']); 

// Admin 
Route::group([ 'middleware' => 'toegang:admin' ], function() 
{ 
    Route::get('dashboard/projecten', '[email protected]'); 
    Route::get('dashboard/groepen', '[email protected]'); 
    Route::get('dashboard/periode', '[email protected]'); 
    Route::get('dashboard/producten', '[email protected]'); 
    Route::get('dashboard/gebruikers', '[email protected]'); 
    Route::get('dashboard/scoring_rubrics', '[email protected]'); 
    Route::get('dashboard/pos', '[email protected]'); 
    Route::get('dashboard/project_status', '[email protected]'); 
    Route::get('dashboard/beoordeling', '[email protected]'); 
}); 


// Student 
Route::group([ 'middleware' => 'toegang:student' ], function() 
{ 
    Route::get('dashboard/project_status_student', '[email protected]'); 
    Route::get('dashboard/account', '[email protected]'); 
}); 

У меня есть несколько ролей администратора/студента, и они используют один контроллер DashBoardController.

SO для доступа к панели мониторинга, как администратор, так и учащийся должен иметь права доступа к домашней странице панели мониторинга. Для конкретных страниц для администратора и ученика я использую две группы маршрутов.

dashboardcontroller @ индекс

class DashboardController extends Controller 
{ 
    /** 
    * Display a listing of the resource. 
    * 
    * @return View View 
    */ 
    public function index() 
    { 
     $autorisatie = Auth::user()->autorisatie(); 
     return view('dashboard.home', compact('autorisatie')); 
    } 

В контроллере приборной панели я получит от роли пользователя по телефону autorisatie()

метод autorisatie в модели пользователя

public function autorisatie($rol = null) 
{ 
    $autorisatie = DB::table('autorisatie') 
     ->select('rol') 
     ->where('autorisatieID', Auth::user()->autorisatieID) 
     ->first(); 

    // Check als de opgegeven role in de routes hetzelfde is 
    // Als de ingelogde user 
    if($rol) 
    { 
     // Return true als $autorisatie rol hetzelfde is als de 
     // opgegeven route role 
     return $autorisatie->rol == $rol; 
    } 

    // return false 
    return $autorisatie->rol; 
} 

И на мой взгляд я проверю различные данные или страницы, например:

вид приборной панели

{{--Extends master page--}}@extends("master.master") 

{{--Section for content area--}} 
@section("content") 
    <h1>Dashboard</h1> 

    <p> 
     Dashboard - {{$autorisatie}} <br> 

     @if ($autorisatie == 'admin') 
      Show admin things..... 
     @elseif ($autorisatie == 'student') 
      Show student things... 
     @endif 
    </p> 
Смежные вопросы