我想在我的控制器中使用__construct
方法中的两个中间件。我最后几个小时在谷歌搜索,但没有找到任何有用的资源。
这是我的__construct
中间件:
public function __construct()
{
$this->middleware('adminuser');
$this->middleware('generaluser')->only('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
}
我想为普通用户提供访问那些generaluser中间件方法。 我是怎么做到的?
请帮我解决这个问题。
谢谢
答案 0 :(得分:5)
所以,你需要使用" OR"对于您的中间件,它不存在。相反,您可以使用middleware parameters并在中间件中发挥魔力。
创建一个中间件来检查所有角色,而不是每个角色都有一个中间件。
use Closure;
class CheckRole
{
public function handle($request, Closure $next, $role)
{
$roles = array_except(func_get_args(), [0,1]) // get array of your roles.
// $request->user()->role IS AN EXAMPlE
if (! in_array($request->user()->role, $roles)) {
// Redirect...
}
return $next($request);
}
接下来是在kernel.php,routeMiddleware数组中注册它:
'role' => \App\Http\Middleware\CheckRole::class,
然后您可以同时检查多个角色
$this->middleware('role:adminuser')->only('functionA', 'functionB');
$this->middleware('role:adminuser,guestuser')->only('functionC', 'functionD');
注意:这是一个示例,您可以根据需要更改中间件中的逻辑。
答案 1 :(得分:4)
在路径文件中使用中间件,而不是在构造
中Route::middleware(['adminuser'])->group(function () {
//Only admins can access this
Route::get('/','Controller@method');
Route::get('/admins','Controller@method');
});
Route::middleware(['generaluser'])->group(function () {
// General users access this
Route::get('/users', 'Controller@method');
Route::get('/generalusers', 'Controller@method');
});
如果您想同时使用两个中间件
Route::middleware(['firstMiddleWare','secondMiddleWare'])->group(function () {
Route::get('/aroute', 'Controller@method');
});
所有用户都可以使用不属于某个组的路由
答案 2 :(得分:1)
我猜adminuser
中间件允许管理员用户阻止其他用户,因此非管理员永远不会到达generaluser
中间件。
您可以尝试从generaluser
中间件中排除adminuser
方法:
public function __construct()
{
$this->middleware('adminuser')->except('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
$this->middleware('generaluser')->only('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
}
答案 3 :(得分:1)
非常感谢Morteza Rajabi给了我这个想法,以下是我对他的想法适用的代码。
我正在为两个用户创建一个新的中间件,这里是代码:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfNotAdminUserOrGeneralUser
{
public function handle($request, Closure $next, $guard = null)
{
switch ($guard) {
case 'adminuser':
if (!Auth::guard($guard)->check()) {
return redirect('/');
}
break;
case 'generaluser':
if (!Auth::guard($guard)->check()) {
return redirect('/');
}
break;
}
return $next($request);
}
}
然后在我的控制器中应用此功能,并按照我的意愿为他们提供访问权限。 admin用户可以访问所有方法,一般用户可以访问其中的一些方法。这意味着两个用户可以访问相同的方法。
这是控制器代码:
public function __construct()
{
$this->middleware('adminuser')->only('index','create','edit','store','delete','trashIndex','restore','permanentlyDelete','addGroups','addGroupsStore','addQuestions','addQuestionsStore','countGroup','countQuestion');
$this->middleware('auserorguser')->only('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
}
再次感谢Morteza Rajabi。