【问题标题】:How to setup two route groups using middleware in Laravel 5.4如何在 Laravel 5.4 中使用中间件设置两个路由组
【发布时间】:2017-12-10 05:13:16
【问题描述】:

我正在设置一个 Web 应用程序,我想在其中区分两个路由组。两组都按预期单独工作,但当它们组合在一起时,其中一个会失败。我检查了 L5.4 网站上的文档并按照说明进行操作。经过一整天的挖掘决定问你。

这是我的 routes/web.php 文件:

Route::group(['middleware' => ['auth']], function () {

    Route::group(['middleware' => ['medewerker']], function () {
        Route::get('/urencorrectie','UrenRegelsController@urencorrectie');
    });

    Route::group(['middleware' => ['officemanager']], function () {
        Route::get('/', 'DashboardController@index');
        Route::post('/', 'DashboardController@index');
        Route::get('/profile', function(){
        return view('profile');});
    });
});
Auth::routes();

Route::get('/home', 'HomeController@index');

为了启用角色,我在用户模型中添加了一个 Rolid 列。角色 1 是办公室经理,角色 3 是员工。

然后在后面的中间件中我们找到employee.php:

namespace App\Http\Middleware;
use Closure;
use Auth;
class Employee
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
    public function handle($request, Closure $next)
    {
        if(Auth::user()->Rolid=='3')
        {
            return $next($request);
        }
        else
        {
            return redirect('/home');
        }
    }
}

中间件 officemanager.php 文件包含:

namespace App\Http\Middleware;
use Closure;
use Auth;

class Officemanager
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $user=Auth::user();
        if(Auth::user()->Rolid=='1')
        {
            return $next($request);
        }
        else
        {
            return redirect('/home');
        }
    }
}

按原样的代码会产生以下结果: - 当办公室经理登录时,他/她会被重定向到正确的路线。一切正常。 - 当员工登录时,他/她会被重定向到 /home 重定向(routing/web.php 文件的底部)。

非常欢迎任何线索或帮助。有点卡在一些可能是基本的东西上。

[更新]

在 kernel.php 中,两个类都被映射:

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'officemanager' => \App\Http\Middleware\Officemanager::class,
    'employee' => \App\Http\Middleware\Employee::class,
];

【问题讨论】:

  • 你能 ddd 把中间件名称映射到类的代码吗?
  • 检查员工的角色ID。也使用 if(Auth::user()->Rolid==1)。
  • 感谢您的回复,非常感谢。 @idob,我用类映射代码 Jamal 更新了我的帖子。你的意思是已经在 web.php 文件中使用了这个条件?文档似乎指导我在中间件类本身中执行此操作。在流程早期这样做的一大优势是您可以保持初始请求不变。我要试验一下这个并报告。

标签: laravel routes middleware


【解决方案1】:

我唯一能想到的是员工的Rolid不是3-所以尝试调试它。

一般来说,不建议在您的代码中依赖 DB id,因为它们可以在环境之间改变。我会为user 模型添加一个关系并检查角色名称:

User model:

public function role()
{
    return $this->belongsTo('App\Role', 'Rolid');
}

员工中间件

class Employee
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::user()->role->name == 'employee')
        {
            return $next($request);
        }
        else
        {
            return redirect('/home');
        }
    }
}

办公室经理中间件:

class Officemanager
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::user()->role->name == 'officemanager')
        {
            return $next($request);
        }
        else
        {
            return redirect('/home');
        }
    }
}

【讨论】:

  • 谢谢伊多布。你的帖子让我意识到我在这里使用了错误的方法。我一直在查看几个来源的一些课程。现在将进行相应设置。
  • 太棒了!只需确保批准答案,以便其他人知道问题已解决
猜你喜欢
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 2017-11-19
  • 2017-09-01
  • 2017-10-17
  • 2017-11-09
相关资源
最近更新 更多