- Миграции
- Модели
- Функции для работы с ролями
Распределение прав пользователей:
Миграция.
php artisan make:migration create_roles_table --create=roles
В таблице roles будут следующие поля:
id,name, created_at, update_at.
По желанию можно добавить еще поля. Например, display_name — отображаемое имя.
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateRolesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('roles', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); Schema::create('users_roles', function (Blueprint $table) { $table->integer('user_id')->unsigned(); $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade'); $table->integer('role_id')->unsigned(); $table->foreign('role_id') ->references('id') ->on('roles') ->onDelete('cascade'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('roles'); Schema::dropIfExists('users_roles'); } }
Запускаем миграцию.
php artisan migrate
Модели.
php artisan make:model Models\Role
Так как мои модели хранятся в папке Models команда выглядит именно так.
Содержимое модели Role
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Role extends Model { /** * Пользователи, которые принадлежат данной роли. */ public function users() { return $this->belongsToMany('App\Models\User', 'users_roles', 'user_id', 'role_id'); } }
Модель User
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { /****/ /** * Функция для получение название роли к которой пользователь принадлежит. * * @return boolean **/ public function roles() { return $this->belongsToMany('App\Models\Role', 'users_roles', 'user_id', 'role_id'); } /** * Проверка принадлежит ли пользователь к какой либо роли * * @return boolean */ public function isEmployee() { $roles = $this->roles->toArray(); return !empty($roles); } /** * Проверка имеет ли пользователь определенную роль * * @return boolean */ public function hasRole($check) { return in_array($check, array_pluck($this->roles->toArray(), 'name')); // начиная с версии 5.1 метода array_fetch не существует //return in_array($check, array_fetch($this->roles->toArray(), 'name')); } /** * Получение идентификатора роли * * @return int */ private function getIdInArray($array, $term) { foreach ($array as $key => $value) { if ($value == $term) { return $key + 1; } } return false; } /** * Добавление роли пользователю * * @return boolean */ public function makeEmployee($title) { $assigned_roles = array(); $roles = array_fetch(Role::all()->toArray(), 'name'); switch ($title) { case 'super_admin': $assigned_roles[] = $this->getIdInArray($roles, 'super_admin'); case 'admin': $assigned_roles[] = $this->getIdInArray($roles, 'admin'); case 'teacher': $assigned_roles[] = $this->getIdInArray($roles, 'teacher'); case 'student': $assigned_roles[] = $this->getIdInArray($roles, 'student'); case 'login': $assigned_roles[] = $this->getIdInArray($roles, 'login'); break; default: $assigned_roles[] = false; } $this->roles()->attach($assigned_roles); } /****/ }
Для использования в роуторе нужно создать посредника.
Middleware.
Выполняем команду.
php artisan make:middleware OwnerMiddleware
Код в посреднике:
<?php namespace App\Http\Middleware; use Closure; class OwnerMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string $role * @return mixed */ public function handle($request, Closure $next, $role) { if (!$request->user()->hasRole($role)) { return redirect('/'); // редирект куда угодно } return $next($request); } }
Далее нужно войти в Kernel.php и добавить в массив routeMiddleware
'role' => \App\Http\Middleware\OwnerMiddleware::class,
Вызов в роуторе:
Route::get('/home', ['as' => 'home', 'middleware' => 'role:admin', 'uses' => 'HomeController@index']);
role:admin — тут любая роль
Примеры использования:
$user = \Auth::user(); // $user->makeEmployee('login'); // присвоить роль login // $user->hasRole('login'); // return true or false // $user->isEmployee(); // return true or false
Если нам нужно запретить какой-то блок в шаблоне можно написать так:
@if(\Auth::user()->hasRole('admin')) /****/ @endif
В миграции create_roles_table замените:
public function down()
{
Schema::drop(‘roles’);
Schema::drop(‘users_roles’);
}
На:
public function down()
{
Schema::dropIfExists(‘users_roles’);
Schema::dropIfExists(‘roles’);
}
В модели User замените:
return in_array($check, array_fetch($this->roles->toArray(), ‘name’));
На:
return in_array($check, array_pluck($this->roles->toArray(), ‘name’));
Ок, спасибо!
Call to undefined method Illuminate\Database\Query\Builder::hasRole() и никак (Laravel 5.4)
Здравствуйте! добавил все как показали , ну как пользоваться, можно пару примеров, пожалуйста