无法将默认用户角色分配给新用户

时间:2019-10-21 10:49:43

标签: php mysql laravel eloquent

错误消息:

Call to undefined method App\User::roles()

我正在尝试将默认角色分配给新用户,但我未能分配它。所有用户信息都存储在数据库中,但角色不能存储在表中。我在此代码中弄错了。帮帮我。我的英语不好,对不起,沟通不好。

这是我的User.php,Role.php,RegisterController.php和HomeController.php文件的代码。看到并告诉我“我在哪里做错了?”

  

这是User.php文件         

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

    class User extends Authenticatable
    {
        use Notifiable;
        /**
        * @param string|array $roles
        */
        public function authorizeRoles($roles)
        {
          if (is_array($roles)) {
              return $this->hasAnyRole($roles) || 
                     abort(401, 'This action is unauthorized.');
          }
          return $this->hasRole($roles) || 
                 abort(401, 'This action is unauthorized.');
        }
        /**
        * Check multiple roles
        * @param array $roles
        */
        public function hasAnyRole($roles)
        {
          return null !== $this->roles()->whereIn('name', $roles)->first();
        }
        /**
        * Check one role
        * @param string $role
        */
        public function hasRole($role)
        {
          return null !== $this->roles()->where('name', $role)->first();
        }  
        /**


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

    /**
     * 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',
    ];
}
  

这是Role.php文件

 <?php

namespace App;
use App\User;
use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    public function users()
    {
      return $this->belongsToMany(User::class);
    }
}
  

此RegisterController.php文件。

    <?php

    namespace App\Http\Controllers\Auth;
    use App\Role;
    use App\User;
    use App\Http\Controllers\Controller;
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Validator;
    use Illuminate\Foundation\Auth\RegistersUsers;

    class RegisterController extends Controller
    {
        /*
        |--------------------------------------------------------------------------
        | Register Controller
        |--------------------------------------------------------------------------
        |
        | This controller handles the registration of new users as well as their
        | validation and creation. By default this controller uses a trait to
        | provide this functionality without requiring any additional code.
        |
        */

        use RegistersUsers;

        /**
         * Where to redirect users after registration.
         *
         * @var string
         */
        protected $redirectTo = '/home';

        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('guest');
        }

        /**
         * Get a validator for an incoming registration request.
         *
         * @param  array  $data
         * @return \Illuminate\Contracts\Validation\Validator
         */
        protected function validator(array $data)
        {
            return Validator::make($data, [
                'name' => ['required', 'string', 'max:255'],
                'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                'password' => ['required', 'string', 'min:8', 'confirmed'],
            ]);
        }

        /**
         * Create a new user instance after a valid registration.
         *
         * @param  array  $data
         * @return \App\User
         */
         protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);

     $user
       ->roles()
       ->attach(Role::where('name', 'student')->first());

    return $user;
    }

This is my role_user database Table
User Database Table
Role Database Table

3 个答案:

答案 0 :(得分:2)

像这样在create文件中重构RegisterController.php方法:

protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);

     $user
       ->roles()
       ->attach(Role::where('name', 'student')->first());

    return $user;
}

您的其余代码将在return之后运行。

像这样将roles关系添加到User模型:

public function roles()
{
    return $this->belongsToMany(User::class);
}

答案 1 :(得分:0)

您可以以此来更新您的创建功能

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
    $role = new App\Role(['role' => 'student']);
    $user->roles()->save($role);
    return $user;
}

来源:https://laracasts.com/discuss/channels/laravel/attach-role-to-a-user-upon-registration?page=1

答案 2 :(得分:0)

您当前在用户模型中没有role()关系。添加以下

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