【问题标题】:Can't assign Default User role to a new user无法将默认用户角色分配给新用户
【发布时间】:2019-10-22 13:38:12
【问题描述】:

错误信息:

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

【问题讨论】:

  • 请修复有问题的Role.php文件。
  • @Immeyti 抱歉,我现在更新它

标签: php mysql laravel eloquent


【解决方案1】:

RegisterController.php 文件中重构您的create 方法,如下所示:

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

【讨论】:

  • @immeti 调用未定义的方法 App\User::roles()
  • 你应该在User模型中添加roles()关系
  • 请检查并告诉我。
  • 谢谢兄弟,你真是太棒了。我做了一个学院项目,主要是老师注册一个学生,东西注册新老师。我如何为不同的用户设置角色,比如老师和东西。我是 laravel 的新手,你能帮帮我吗?我给你我的邮件 ID,当你有空时联系我。 at0578811@gmail.com
【解决方案2】:

你可以用这个更新你的创建函数

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

【讨论】:

    【解决方案3】:

    您的用户模型中目前没有角色() 关系。添加以下内容

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2022-01-14
      • 2017-03-19
      • 1970-01-01
      • 2016-03-09
      • 2011-10-08
      • 1970-01-01
      相关资源
      最近更新 更多