公開フラグ@laravel8。管理画面では表示したいが、一般には表示したくない場合は、グローバルスコープを定義したトレイトを使う
グローバルスコープとは、モデルを使う時は、常に有効化されている絞り込み(where)
参考URL
https://qiita.com/ll_kuma_ll/items/0af05dfe999b2fdc539d
1, laravelを新規にインストールして、Postクラスを作っておく
1 |
php artisan make:model --all |
2, App\Traits\www_public.phpを手動で作る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Traits; use Illuminate\Database\Eloquent\Builder; // 一般公開用trait trait www_public { /** * 初期起動(bootプレフィックスでトレイト名をメソッド名にする事で勝手に呼んでくれる) * @return void */ protected static function bootwww_public(): void { static::addGlobalScope('www_public', function(Builder $builder) { $builder->where('public_flag', true); }); } } |
3, Postクラスにwww_publicトレイとを読み込ませる
1 2 3 4 5 6 |
use App\Traits\www_public; // 公開フラグtrait class Post extends Model { use www_public; } |
4, routes/api.phpに記述
1 2 |
use App\Http\Controllers\PostController; Route::apiResource('post', PostController::class); |
5, テーブル定義やSeederを適当にやる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class PostFactory extends Factory { /** * Define the model's default state. * * @return array */ public function definition() { return [ 'user_id' => 1, 'public_flag' => mt_rand(0,1), 'content' => Str::random(10), ]; } } |
6, PostControllerで取得すると、確かにpublic_flag=1のレコードしか取得できない!
1 2 3 4 5 |
$query = Post::query(); return $query->get(); // グローバルスコープ無しの場合は、www_publicの名前で指定する // $query = Post::withoutGlobalScope('www_public'); |
7, if文でwithoutGlobalScopeを切り分けるのが面倒なので、ユーザ認証済みだったら、そもそもグローバルスコープのwhereなし状態にする
1 2 3 4 5 6 7 8 9 |
protected static function bootwww_public(): void { static::addGlobalScope('www_public', function(Builder $builder) { // ログインしてたら全レコード表示 if(auth('sanctum')->check() === false){ $builder->where('public_flag', true); } }); } |
ログイン状態で切り分けしてくれるので、既存コードは修正しなくていいので楽だ!
ただクエリビルダの所は、手動でやらんとな…。