Laravel中的角色未按预期工作

时间:2019-06-09 00:51:11

标签: laravel roles

这本书是我做的,是我的laravel程序的角色。问题发生在一个特定的实例中,用户模型中的方法之一总是“弹出”……无论用户对role_id拥有什么,方法总是显示某些角色的名称,在这种情况下为“主持人”。不知道它有什么问题,或者至少我看不到它...

这是用户模型:

<?php

    namespace App;

    use Illuminate\Notifications\Notifiable;
    use Illuminate\Contracts\Auth\MustVerifyEmail;
    use Illuminate\Foundation\Auth\User as Authenticatable;

    class User extends Authenticatable
    {
        use Notifiable;

        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'name', 'email', 'password',"avatar"
        ];

        /**
         * The attributes that should be hidden for arrays.
         *
         * @var array
         */
        protected $hidden = [
            'password', 'remember_token',
        ];

        /**
         * The attributes that should be cast to native types.
         *
         * @var array
         */
        protected $casts = [
            'email_verified_at' => 'datetime',
        ];

        public function rola(){
            return $this->belongsTo("App\Roles", "id");
        }

        public function posts(){
            return $this->hasMany("App\Post");
        }

        public function comments(){
            return $this->hasMany("App\Comment");
        }

        public function isAdmin()
        {//dd($user);

            return $this->rola()->where('role', 'administrator');
        }

        public function isModerator()
        {//dd($user);

            return $this->rola()->where('role', 'moderator');
        }

        public function isUser()
        {//dd($user);

            return $this->rola()->where('role', 'user');
        }

        public function isPeon()
        {//dd($user);

            return $this->rola()->where('role', 'peon');        
        }

}

这是角色模型:

<?php

    namespace App;

    use Illuminate\Database\Eloquent\Model;

    class Roles extends Model
    {
        public function rola(){
            return $this->hasMany("App\User", "role_id");
        }
    }

例如,如果仅在任何视图中显示:

    {{auth()->user()->rola->id}} <br> // 2 <- correct
    {{auth()->user()->role_id}} // 3 <- this should be 2 also.

这是我的数据库模式的图像: schema

和角色表的图像: roles

默认情况下,每当新用户注册时,它都会自动收到ID为4的“ peon”角色。 不知道我的错误在哪里,也许我没看到东西...

编辑1:

这里是指向github repo的链接,供那些想念它的人使用。

3 个答案:

答案 0 :(得分:3)

好吧,我认为问题出在 User.php 文件中的rola()函数中:您正在定义belongsTo关系的外键,这里是{ {1}}。

应该为id,因为这是Eloquent试图映射到Roles模型的role_id的关键。 See the documentation了解更多信息

答案 1 :(得分:3)

要改善您的应用程序,请不要为每个角色使用一个功能。 假设在角色表上有100个角色,使用当前代码,您还将需要100个函数,例如isAdminisSomething

添加类似这样的内容:

    public function hasRole($roleName)
    {
        return $this->rola()->where('role', $roleName);
    }

    /**
    * Check if the user has any of the given roles.
    */
    public function hasAnyRole(array $roleNames)
    {
        $userRole = $this->rola;
        return in_array($userRole->name, $roleNames);
    }

现在您可以检查角色了:

    $user->hasRole('admin'); //If the user has the admin role, returns true. Otherwise returns false.

要在刀片视图上检查角色,请执行以下操作:

@if(Auth::check())
    @if(Auth::user()->hasRole('role-name') || Auth::user()->hasRoles('another-role-name'))
        //Your markup here
    @endif
@endif

对于多个角色:

@if(Auth::check())
    @if(Auth::user()->hasAnyRoles(['role-name', 'another-role-name']))
        //Your markup here
    @endif
@endif

希望有帮助。

答案 2 :(得分:0)

问题出在您的rola()函数中。 您在belongsTo上使用了错误的外键。应该是role_id,而不是id(当前是)。

以下是经过改进的代码段:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',"avatar"
    ];
     /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
    * The attributes that should be cast to native types.
    *
    * @var array
    */

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function rola(){
        return $this->belongsTo("App\Roles", "role_id");
        //Or just return $this->belongsTo(Roles::class);
    }

    public function posts(){
        return $this->hasMany("App\Post");
    }

    public function comments(){
        return $this->hasMany("App\Comment");
    }

    public function isAdmin()
    {//dd($user);
        return $this->hasRole('admin');
    }

    public function isModerator()
    {//dd($user);
       return $this->hasRole('moderator');
    }

    public function isUser()
    {//dd($user);
        return 
        return $this->hasRole('user');
    }

    public function isPeon()
    {//dd($user);
        return $this->hasRole('peon');
    }

    public function hasRole($role)
    {
        return $this->rola->role === $role;
    }
}

我建议您将“角色”模型中的rola函数重命名为users,因为它会返回所有具有某些角色的用户。

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Roles extends Model
{
    public function users(){
        return $this->hasMany(User::class, 'role_id');
    }
}

另一件事:看看this package。它确实可以帮助您处理用户,权限和权限组。

希望有帮助。