一个用于不同用户Laravel的控制器

时间:2015-02-05 20:40:32

标签: php laravel

假设我有不同的用户可以访问某些页面。页面几乎相同,但稍有更改,如删除按钮不会显示给用户,但管理员..等等。

如果我有一个名为DashboardController的控制器,它有一个方法索引,显示一些与用户类型相关的信息。

我有两种方法,一种是制作不同的控制器,如:

Admin\DashboardController
User\DashboardController

但我的路线就像:localhost/admin/dashboardlocalhost/user/dashboard

另一种方法是创建一个名为DashboardController的控制器,并检查那里的用户类型。

那么哪种方法更好,是否有更好的方法来制作一个URL而不是为它们添加前缀?

2 个答案:

答案 0 :(得分: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

请注意,这并不能保护您删除&#39;终点! 在这些路线上添加前置过滤器就足够了。

// routes.php

Route::delete('resource', [
    'as' => 'resource.delete',
    'uses' => 'DashboardController@delete',
    '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

查看过滤类&#39;。

答案 1 :(得分:0)

我已经按照以下方式解决了这个问题

routes.php文件

Route::get('dashboard', ['middleware' => 'auth', 'uses' => 'DashboardController@index']);

// Admin
Route::group([ 'middleware' => 'toegang:admin' ], function ()
{
    Route::get('dashboard/projecten', 'ProjectController@index');
    Route::get('dashboard/groepen', 'GroepController@index');
    Route::get('dashboard/periode', 'PeriodeController@index');
    Route::get('dashboard/producten', 'ProductController@index');
    Route::get('dashboard/gebruikers', 'UserController@index');
    Route::get('dashboard/scoring_rubrics', 'ScroingRubricsController@index');
    Route::get('dashboard/pos', 'PosController@index');
    Route::get('dashboard/project_status', 'ProjectStatusController@index');
    Route::get('dashboard/beoordeling', 'BeoordelingController@index');
});


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

我有多个角色admin / student,他们使用一个控制器DashBoardController。

要访问仪表板,管理员或学生必须是auth才能访问仪表板主页。对于管理员和学生的特定页面,我使用两个路由组。

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>