我在尝试获取非对象的属性时遇到错误,我创建了角色和用户表,并将外键传递给用户表,不,我只希望对管理控制台进行身份验证和管理用户访问
我尝试不同的逻辑但对我不起作用这是我的代码
UserModel :
public function role(){
return $this->belongsTo(\App\Role::class);
}
角色模型:
public function users(){
return $this->hasMany(\App\User::class);
}
AdminController :
public function __construct()
{
return $this->middleware(['auth','CheckAdmin']);
}
public function index(){
//$adminUsers = User::with('roles')->where('id',auth()->user()->id)->get();
//dd($adminUsers);
return view('backend.admin.index');
}
CheckAdminMiddleware :
public function handle($request, Closure $next)
{
if(Auth::user()->role->name == 'Admin'){
return redirect('/admin')->with('message', "Successfully Login");
}
return $next($request);
}
我的UserTable:
$table->increments('id');
$table->unsignedInteger('role_id')->default(1);
$table->string('name');
$table->string('username')->unique();
$table->string('email')->unique();
$table->string('phone_no',15)->nullable();
$table->string('password');
$table->rememberToken();
$table->enum('status', [0,1])->default(1);
$table->timestamps();
$table->softDeletes();
我的角色表:
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unique();
$table->boolean('deletable')->default(true);
$table->timestamps();
$table->softDeletes();
});
我在中间件中遇到错误。我在做什么错了?
答案 0 :(得分:0)
因为您的Auth::user()->role
返回集合而不是对象。
您应该致电Auth::user()->role['name']
。
答案 1 :(得分:0)
您最接近获得结果。所以试试这些:
public function __construct() { $this->middleware(['auth','CheckAdmin']); // without return keyword }
立即检查。
protected $routeMiddleware = [ // ... 'CheckAdmin'=> CheckAdminMiddleware::class, ];
并运行“ php artisan config:cache”。
public function __construct() { $this->middleware(['auth']); }
并将该中间件附加到路由中(而不是控制器),如下所示:
Route::group([
'as' => 'admin.',
'prefix' => 'admin',
'middleware' => [
'checkAdmin', // THE THING
],
], function () {
Route::get('dashboard', 'Admin\DashboardController@dashboard');
答案 2 :(得分:0)
如果您熟悉laravel关系,那么您将知道many-to-many
关系将返回
Illuminate\Support\Collection
因此您可以使用Contains方法https://laravel.com/docs/5.8/collections#method-contains
将以下代码粘贴到 UserModel
中public function hasRole($role)
{
return $this->roles()->get()->pluck('name')->contains($role);
}
和中间件代码
public function handle($request, Closure $next)
{
if(Auth::user()->hasRole('Admin')){
return redirect('/admin')->with('message', "Successfully Login");
}
return $next($request);
}
因此,我们得到roles of Auth User
并使用包含给定(角色)