遇到错误尝试获取非对象的属性

时间:2019-10-04 06:23:47

标签: laravel laravel-5.8

我在尝试获取非对象的属性时遇到错误,我创建了角色和用户表,并将外键传递给用户表,不,我只希望对管理控制台进行身份验证和管理用户访问

我尝试不同的逻辑但对我不起作用这是我的代码

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();
});

我在中间件中遇到错误。我在做什么错了?

3 个答案:

答案 0 :(得分:0)

因为您的Auth::user()->role返回集合而不是对象。 您应该致电Auth::user()->role['name']

答案 1 :(得分:0)

您最接近获得结果。所以试试这些:

  1. 首先:像这样从__construct删除“ return”:
public function __construct()
{ 
    $this->middleware(['auth','CheckAdmin']); // without return keyword
}

立即检查。

  1. 确保您已经在$ routeMiddleware的末尾(在“ app \ Http \ Kernel.php”中)注册了该中间件
protected $routeMiddleware = [
     // ...
     'CheckAdmin'=> CheckAdminMiddleware::class,
];

并运行“ php artisan config:cache”。

  1. 如果相同,则只需从__contstruct()中删除“ CheckAdmin”,如下所示:
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并使用包含给定(角色)

(角色)数组进行检查