【发布时间】:2018-09-25 15:41:15
【问题描述】:
我有一个多级会员网站,需要在 Laravel 5.5 的 web.php 文件中保护我的路由。
我的用户表中有一个名为 role_id 的列。
在role_id 中是以下值
- NULL(对于新用户)
- 1(对于所有者)
- 2(对于管理员)
- 3(版主)
- 4(针对被禁用户)
我试图用一个简单的 IF 语句来做到这一点
if (Auth::user()->role_id != '2'):
return view('home');
else:
//ADMIN ROUTES
Route::get('/admin','AdminController@index')->name('admin');
endif;
if (Auth::user()->role_id != '1'):
return view('home');
else:
//OWNER ROUTES
Route::get('/admin','OwnerController@index')->name('owner');
endif;
ETC....
但是在尝试获取非对象的属性时出错。也可能不是最好的方法。
所以我读到了这样的 MIDDLEWARE:(看起来好多了)
Route::group(['middleware' => ['auth', 'admin']], function() {
// put all your admin routes here
});
Route::group(['middleware' => ['auth', 'owner']], function() {
// put all your owner user routes here
});
但它没有说明如何添加中间件。 我是否必须为每个组创建 5 个不同的中间件文件,类似于我找到的文件:
use Illuminate\Contracts\Auth\Guard;
class Admin
{
protected $auth;
public function __construct(Guard $auth)
{
$this->auth = $auth;
}
public function handle($request, Closure $next)
{
if($this->auth->user()->role_id != '2') {
return redirect()->view('home');
}
return $next($request);
}
}
有人可以伸出援助之手并解释如何编写正确的中间件来实现这一点吗?
【问题讨论】:
-
确保
Auth::user()不为空.. -
它为空,我以管理员身份登录。这是为什么呢?
-
Trying to get property of non-object表示您尝试在某处执行$foo->bar但$foo不是对象。 -
抱歉@echo,我只是浏览了您的代码并注意到只有
Auth::user()或$this->auth->user()可能返回空值。 @Scuzzy 是对的,也许你可以发布堆栈跟踪,这样我们就可以找到真正在抛出Trying to get property of non-object的人?
标签: php laravel laravel-5 middleware laravel-middleware