- Миграции
- Модели
- Функции для работы с ролями
Распределение прав пользователей:
Миграция.
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)
Здравствуйте! добавил все как показали , ну как пользоваться, можно пару примеров, пожалуйста