2015-05-04 39 views
0

我对Laravel非常陌生,并且正在尝试为用户实现角色。Laravel 5检查角色给出错误“尝试获取非对象的属性”

  1. 我已经创建与它
  2. 相关联的角色表和模型我添加了一个列roleusers表。
  3. 我现在试图去检查在User模型

编辑角色:一个答案/这里的解释后,我在users表改变rolerole_id但我仍然得到同样的错误。

这里是我的用户模型...

<?php namespace App; 

use Illuminate\Auth\Authenticatable; 
use Illuminate\Database\Eloquent\Model; 
use Illuminate\Auth\Passwords\CanResetPassword; 
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; 
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; 
use Auth; 

class User extends Model implements AuthenticatableContract, CanResetPasswordContract { 

    use Authenticatable, CanResetPassword; 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'users'; 

    // more stuff 

    public function role() 
    { 
     return $this->belongsTo('App\Role'); 
    } 

    public function isAdmin() 
    { 
     return $this->role->slug == 'admin'; 
    } 

} 

而且我的榜样

<?php namespace App; 

use Illuminate\Database\Eloquent\Model as Eloquent; 

class Role extends Eloquent { 

    protected $table = 'roles'; 

    public function users() 
    { 
     return $this->hasMany('App\User'); 
    } 

} 

当我去我的管理页面,我有以下功能...

public function index(User $user) 
{ 
    if ($user->isAdmin()) { 
     return view('admin/home_admin'); 
    } 
    else { 
     return redirect('home'); 
    } 
} 

但是我得到错误...

尝试获取User.php中非对象的属性62行 HandleExceptions-> handleError('8','试图获取非对象的属性 ','/ home/vagrant/Code/esearch /应用程序/ user.php的”,‘62’,62

我试图此而在记录和不与正确的角色登录阵列()) 在user.php的线。我在这里错过了很明显的东西吗

+0

在最后一个面板中更改您的User to Guard。这应该是你正在寻找的修复。或者你可以直接使用'Auth :: user() - > isAdmin()' –

+1

这个工作谢谢 – Adrian

回答

2

代码问题始于@ user3158900注意到的role_id设置。这是需要解决的问题。

但是当您尝试查看发生了什么时,您正在使用不正确的用户形式。代替User $user,您需要Guard $userGuard $auth,因为它更常见。您也可以使用Auth::user()->isAdmin()

还有最后一件事应该看看,我在上面的评论中没有提到。

如果用户未登录并且是访客,您将在尝试查找Auth::user()时遇到错误,并且会失败。这是因为当你是一个客人时,Auth::user()为空。所以你应该做一个检查登录。

你可以使用!Auth::guest()Auth:check()(这是更清洁)。

希望这对你有好处!

+0

感谢您的解释,即时通讯不能确定哪个将被视为正式的正确答案,因为这两个修复程序都是必需的。 – Adrian

1

你就近了。 Laravel假定外部角色为role_id,但由于您使用的是role,因此您需要在关系中设置该外键。

在您的Role模型中。

public function users() 
{ 
    return $this->hasMany('App\User', 'role'); 
} 

在您的User模型中。

public function role() 
{ 
    return $this->belongsTo('App\Role', 'role'); 
} 

因为role都希望能与一个功能,在您的表中的列,这将是最好修改列名role_id匹配的内容Laravel期待。

+0

感谢您的帮助,虽然我得到一个错误,未定义的属性:App \ User :: $在BelongsTo.php中的作用行74. 我仔细检查,以确保'角色'是我在用户表中的列名称,但仍然没有运气。 – Adrian

+0

对不起,我刚刚意识到关系名称和列名称是相同的,所以当您尝试使用'$ user-> role'时,我不确定它是否会返回'role'列或关系中的内容你设置。是否可以撤销我告诉你的内容,只是将'role'表列改为'role_id'? – user3158900

+0

我最终做到了这一点,尽管我似乎回到了一个Im得到“尝试获取非对象属性”的错误,这非常奇怪(这次是以role_id为列名)。我感觉它的东西很小,但感谢您的帮助。 – Adrian

相关问题