middlewareでユーザーroleを判定して出し分けようかと考えていたが、Laravel8系から実装された新機能として、Jetstreamチーム版でユーザの役割・権限を簡単に設定できるそうなので、それを使ってみて、Jetstreamが良いかMiddleware制御が良いか判断したい。
jetstream付きでインストールするにはインストーラーでインストールする必要がある為、
$ composer global require laravel/installer
$ export PATH=”/home/vagrant/.config/composer/vendor/bin:$PATH”
$ laravel new jettest –jet
$ cd jettest
$ php artisan –version
Laravel Framework 8.15.0
mysql> create database jetstream;
.env
DB_DATABASE=jetstream
$ php artisan migrate
mysql> show tables;
+————————+
| Tables_in_jetstream |
+————————+
| failed_jobs |
| migrations |
| password_resets |
| personal_access_tokens |
| sessions |
| team_user |
| teams |
| users |
+————————+
8 rows in set (0.00 sec)
-> teams, team_user テーブルが出来ている
mysql> describe teams;
+—————+—————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+—————+—————–+——+—–+———+—————-+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| user_id | bigint unsigned | NO | MUL | NULL | |
| name | varchar(255) | NO | | NULL | |
| personal_team | tinyint(1) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+—————+—————–+——+—–+———+—————-+
6 rows in set (0.00 sec)
// Team版のLivewireをインストール
$ php artisan jetstream:install livewire –teams
$ npm install && npm run dev
$ php artisan serve –host 192.168.33.10 –port 8000
register
L 2つのユーザを作成します。
hpscript hpscript@gmail.com yamada yamada@gmail.com
login後
manage team “Team Settings, Create New Team”が追加されています。
### Team Setting
Team Name: Let’s Go
Add Team Member: メンバーのEmailを追加
### 役割、権限の編集
– “general”の権限を追加します
app/Providers/JetstreamServiceProvider.php
protected function configurePermissions() { Jetstream::defaultApiTokenPermissions(['read']); Jetstream::role('admin', __('Administrator'), [ 'create', 'read', 'update', 'delete', ])->description(__('Administrator users can perform any action.')); Jetstream::role('editor', __('Editor'), [ 'read', 'create', 'update', ])->description(__('Editor users have the ability to read, create, and update.')); Jetstream::role('general', __('General'), [ 'general', ])->description(__('General')); }
Roleにgeneralが追加されました。
hpscript@gmail.comでログインして、yamada@gmail.comを”general”のroleで追加します。
mysql> select * from team_user;
+—-+———+———+———+———————+———————+
| id | team_id | user_id | role | created_at | updated_at |
+—-+———+———+———+———————+———————+
| 1 | 1 | 2 | general | 2020-11-18 05:37:18 | 2020-11-18 05:37:18 |
+—-+———+———+———+———————+———————+
1 row in set (0.00 sec)
resources/views/test.blade.php
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <h1>jetstream test</h1> </body> </html>
routes/web.php
Route::get('/test', '\App\Http\Controllers\TestController@index');
$ php artisan make:controller TestController
app/Http/Controllers/TestController.php
class TestController extends Controller { // public function index() { return view('test.index'); } }
app/Http/Controllers/TestController.php
public function index(Request $request) { $team = $request->user()->currentTeam; if(auth()->user()->hasTeamPermission($team, 'read')){ return view('test'); } return view('dashboard'); }
yamadaでログインして、current teamをlet’s goにする。
そして、/testを叩くと、dashboardにリダイレクトされる。
簡単なのかややこしいのかわからんが、roleって概念だから、teamとはちょっと違う気がするんだような。
さて、頑張って設計書作るかー モチベーションを上げないと。。。