【问题标题】:Laravel 5 check role giving error "trying to get property of non object"Laravel 5检查角色给出错误“试图获取非对象的属性”
【发布时间】:2015-05-04 12:31:11
【问题描述】:

我对 Laravel 很陌生,正在尝试为用户实现角色。

  1. 我已经创建了 Role 表和与之关联的 Model
  2. 我在users 表中添加了一列role
  3. 我现在正在尝试检查 User 模型中的角色

编辑:在这里回答/解释后,我将users 表中的role 更改为role_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/app/User.php', '62', array()) 在 User.php 第 62 行

我在登录时尝试过此操作,但没有以正确的角色登录。我在这里遗漏了什么明显的东西吗?

【问题讨论】:

  • 在最后一个面板中将您的用户更改为 Guard。这应该是您正在寻找的解决方案。或者你可以直接使用Auth::user()-&gt;isAdmin()
  • 成功了,谢谢

标签: php laravel


【解决方案1】:

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

但是您在尝试查看正在发生的事情时使用了不正确的用户形式。而不是User $user,您需要Guard $userGuard $auth,因为它更常见。您也可以使用Auth::user()-&gt;isAdmin()

最后一件事是我在上面的评论中没有提到的。

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

您可以使用!Auth::guest()Auth:check()(更简洁)。

希望这对你有好处!

【讨论】:

  • 感谢您的解释,我不确定哪个会被视为正式正确的答案,因为这两个修复都需要。
【解决方案2】:

你很接近。 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 的预期。

【讨论】:

  • 感谢您的帮助,虽然我收到错误,未定义的属性:BelongsTo.php 第 74 行中的 App\User::$role。我仔细检查以确保 role 是我的列名用户表,但仍然没有运气。
  • 抱歉,我刚刚意识到关系名称和列名称是相同的,所以当您尝试使用 $user-&gt;role 时,我不确定它是否会返回 role 列中的内容或者你建立的关系。是否有可能撤消我告诉你的内容并将role 表列更改为role_id
  • 我最终确实做到了,尽管我似乎回到了第一方,我得到“试图获取非对象的属性”错误,这很奇怪(这次是 role_id列名)。我感觉它有点小,但无论如何感谢您的帮助。
  • 您能否确保您的数据库中有适合此关系的数据,并向我们展示您的isAdmin 函数?
  • 既然您已经完成了答案中的所有解释,最好将其标记为正确,以免误导人们。
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2018-06-02
  • 2017-08-20
相关资源
最近更新 更多