【问题标题】:One Controller for Different Users Laravel一个控制器为不同的用户 Laravel
【发布时间】:2015-02-05 20:40:31
【问题描述】:

假设我有不同的用户可以访问某些页面。页面几乎相同,但有一些细微的变化,比如删除按钮不是为用户显示的,而是为管理员显示的……等等。

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

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

Admin\DashboardController
User\DashboardController

但我的路线是这样的:localhost/admin/dashboardlocalhost/user/dashboard

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

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

【问题讨论】:

  • 绝对让它成为一个控制器,除非你有很多不同的控制器逻辑。并且只使用其中的一个视图 - 然后,只需执行简单的 @if(admin condition) 即可显示额外的按钮等。

标签: php laravel


【解决方案1】:

我建议看看作曲家: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' => '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

看看“过滤器类”。

【讨论】:

  • 以上是使用 Laravel 4 格式编写的。 Laravel 5 使用 ServiceProviders 来注册大部分操作。
【解决方案2】:

我已经通过以下方式解决了这个问题

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');
});

我有多个角色管理员/学生,他们使用一个控制器 DashBoardController。

所以要访问仪表板,管理员或学生都必须是访问仪表板主页的身份验证。对于管理员和学生的特定页面,我使用两个路由组。

dashboardcontroller@index

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() 从用户那里获取角色

用户模型中的自动化方法

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>

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 2016-04-07
    • 1970-01-01
    • 2014-11-01
    • 2020-10-17
    • 2019-10-26
    • 2020-07-07
    • 1970-01-01
    • 2019-08-07
    相关资源
    最近更新 更多