namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\Guard;
class isAdmin
{
public function __construct(Guard $auth) {
$this->auth = $auth;
}
/**
* 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()->check() && $user->isAdmin()){
return $next($request);
}
abort(403, 'You do not have permission to perform this action.');
}
这是在我的user.php模型中
protected function roleId(){
return auth()->user()->role_id;
}
public function isAdmin()
{
if ( $this->roleId() === 4 || $this->roleId() === 6 ) {
return true ;
}
else {
return false ;
}
}
这是在我的route / web.php文件中
Route::group([
'namespace' => 'Admin',
'middleware' => 'isAdmin',
'prefix' => 'admin'
], function () {
Route::get('/', 'DashboardController@index')->name('admin.dashboard');
});
但是它的速度很慢,我可以提高它的速度吗?我绝对可以重定向,但是它的速度很慢,我想提高它的速度,也许可以做一些优化。你们的任何提示。.
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
ini_set('max_execution_time', 180);
class DashboardController extends Controller {
public function index()
{
return view('app.admin.dashboard');
}
}
编辑代码以查看仪表板视图中的内容
答案 0 :(得分:0)
我想说您当前的代码也有一些改进的地方。
您的用户模型似乎具有嵌套功能。例如中间件先调用isAdmin()
,然后再调用roleId()
,然后调用auth()->user()->role_id
,而不是$this->role_id
。
例如使用policy代替使用中间件。 DashboardPolicy
。
您的政策可以采用以下方法:
public function index(User $user)
{
return in_array($user->role_id, [4, 6]);
}
然后将其注册到app/Providers/AuthServiceProvider.php
中:
protected $policies = [
.
.
.
Document::class => DocumentPolicy::class,
]
然后在您的控制器中执行
public function index(){
$this->authorize('index', Dashboard::class);
return view('app.admin.dashboard');
}
这将更清洁。
现在要调试时间问题,您可以注释所有自定义中间件,并使其保持简单的返回视图。如果速度很快,则可能是您的自定义中间件之一引起的。如果实施策略方法,则可以直接删除isAdmin中间件。