Невозможно назначить роль пользователя по умолчанию новому пользователю - PullRequest
0 голосов
/ 21 октября 2019

Сообщение об ошибке:

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

Это моя база данных role_user Таблица
Таблица базы данных пользователей
Таблица базы данных ролей

Ответы [ 3 ]

2 голосов
/ 21 октября 2019

Выполните рефакторинг вашего 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);
}
0 голосов
/ 21 октября 2019

В настоящее время у вас нет отношения role () в вашей пользовательской модели. Добавить следующее

public function roles()
{
    return $this->hasMany('App\Role');
}
0 голосов
/ 21 октября 2019

Вы можете обновить функцию создания с помощью этого

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...