如何在Laravel 9中的同一路线名称上使用多个中间Wares?

发布于 2025-02-10 07:27:01 字数 1769 浏览 0 评论 0原文

我希望我的 /仪表板页面在2种不同的用户类型中成为不同的面板。如果未登录,返回主屏幕。我创建了2个中间Wares来检查登录用户是“雇主”或“雇员”。无论我做什么,我似乎都无法使它起作用,已经两天了。我通过遵循一些非常粗略的教程来创建中间的中间菜和路线,这可能会伤害您的眼睛,请注意。

我的路线:

Route::get('/dashboard', function () {
    return view('welcome');
})->name('welcome');


Route::prefix('admin')->middleware([\App\Http\Middleware\isEmployer::class])->group( function () {
    Route::get("/dashboard", function (){
        return view("employer.dashboard");
    })->name("dashboard");
});


Route::prefix('store')->middleware([\App\Http\Middleware\isEmployee::class])->group( function(){
    Route::get("/dashboard", function (){
       return view("employee.dashboard");
    })->name("dashboard");
});

Isemployee中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class isEmployee
{
    public function handle(Request $request, Closure $next)
    {
        if(Auth::user())
        {
            if (Auth::user()->role == "employee")
            {
                return $next($request);
            }
        }

        return response()->view('welcome');
    }
}

Isemployer中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class isEmployer
{
    public function handle(Request $request, Closure $next)
    {
        if(Auth::user())
        {
            if (Auth::user()->role == "employer")
            {
                return $next($request);
            }
        }

        return response()->view('welcome');
    }
}

我想实现的目标是:

如果未登录:

如果登录为雇主,请返回欢迎视图:返回雇主

:Dashboard View如果登录为雇员

I want my /dashboard page to be a different panel in 2 different user types. And return to home screen if not logged in. I created 2 middlewares to check if logged in user is "employer" or "employee". Whatever I do, I can't seem to make it work, it's been 2 days. I created middlewares and routes by following some very sketchy tutorials, it may hurt your eyes, be aware.

My route:

Route::get('/dashboard', function () {
    return view('welcome');
})->name('welcome');


Route::prefix('admin')->middleware([\App\Http\Middleware\isEmployer::class])->group( function () {
    Route::get("/dashboard", function (){
        return view("employer.dashboard");
    })->name("dashboard");
});


Route::prefix('store')->middleware([\App\Http\Middleware\isEmployee::class])->group( function(){
    Route::get("/dashboard", function (){
       return view("employee.dashboard");
    })->name("dashboard");
});

isEmployee middleware:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class isEmployee
{
    public function handle(Request $request, Closure $next)
    {
        if(Auth::user())
        {
            if (Auth::user()->role == "employee")
            {
                return $next($request);
            }
        }

        return response()->view('welcome');
    }
}

isEmployer middleware :

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class isEmployer
{
    public function handle(Request $request, Closure $next)
    {
        if(Auth::user())
        {
            if (Auth::user()->role == "employer")
            {
                return $next($request);
            }
        }

        return response()->view('welcome');
    }
}

What I want to achieve is:

if not logged in : return welcome view

if logged in as employer : return employer.dashboard view

if logged in as employee : return employee.dashboard view

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

徒留西风 2025-02-17 07:27:01

让我们从一些重构开始:

  1. 使您的路由/web.php更可读性:

      route :: view('/dashboard','Welcome') - &gt; name('Welcome');
    
    路由:: prefix('admin') - &gt; name('admin。') - &gt; middleware('角色:雇主') - &gt; group(function(){
        路由:: view('/dashboard','雇主.dashboard') - &gt; name(“ dashboard”);
    });
    
    路由:: prefix('store') - &gt; name('store。') - &gt; middleware('角色:员工') - &gt; group(function(){
        路由:: view('/dashboard','雇员.dashboard') - &gt; name(“ dashboard”);
    });
     
  2. 现在,让我们创建一个中间件,不仅可以检查一个角色,而且还可以作为参数扮演的任何角色:

     &lt;?php
    
    命名空间应用\ http \ middleware;
    
    使用闭合;
    使用照明\ http \ request;
    使用Illuminate \ support \ aftades \ auth;
    
    上课
    {
        公共功能句柄(请求$请求,关闭$ NEXT,字符串$角色)
        {
            if(auth :: user()? - &gt; cool!= $ crom){
                返回redirect() - &gt; route('Welcome');
            }
    
            返回$ next($请求);
        }
    }
     
  3. 现在,在app/http/kernel.php中创建一个别名,以便您可以像我在路由文件中写的那样使用它角色:&lt; cromor_here&gt;

    <
    // ...
    '角色'=&gt; \ app \ http \ middleware \ hasrole :: class,
    ];

现在为您的问题 - 如何将多个中间件用于一条路线。很简单:

$route->middleware(['middleware1', 'middleware2']);

您可以将它们附加到组或单个路线上:

Route::prefix('some_group')->middleware(['middleware1', 'middleware2'])->group(function() {
    Route::view("some.view")->middleware('middleware3')->name("some.view");
});

您可以阅读有关Laravel的Middlewares 在这里,并了解什么 /a>是(中间件在引擎盖下实现的模式)。还要查看 solid 原理,主要是在干燥的地方。祝你有美好的一天=)

Let's start from some refactoring:

  1. Make your routes/web.php a bit more readable:

    Route::view('/dashboard', 'welcome')->name('welcome');
    
    Route::prefix('admin')->name('admin.')->middleware('role:employer')->group(function() {
        Route::view('/dashboard', 'employer.dashboard')->name("dashboard");
    });
    
    Route::prefix('store')->name('store.')->middleware('role:employee')->group(function() {
        Route::view('/dashboard', 'employee.dashboard')->name("dashboard");
    });
    
  2. Now let's create a middleware that will check not only for one role, but for any role you give as a parameter:

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    
    class HasRole
    {
        public function handle(Request $request, Closure $next, string $role)
        {
            if (Auth::user()?->role != $role) {
                return redirect()->route('welcome');
            }
    
            return $next($request);
        }
    }
    
  3. Now, create an alias in your app/Http/Kernel.php so you could use it like i wrote it in routes file role:<role_here>:

    protected $routeMiddleware = [
        // ...
        'role' => \App\Http\Middleware\HasRole::class,
    ];
    
    

Now for your question - how to use multiple middlewares for one route. It is simple:

$route->middleware(['middleware1', 'middleware2']);

You may attach them to groups or single routes:

Route::prefix('some_group')->middleware(['middleware1', 'middleware2'])->group(function() {
    Route::view("some.view")->middleware('middleware3')->name("some.view");
});

You can read more info about Laravel's middlewares here, and understand what responsibility chain is (pattern which middleware implements) under the hood. Also take a look at SOLID principles, mainly at DRY one. Have a good day =)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文