laravel8でcrud操作時に必ずして欲しい処理がある時は、observerが便利。
1. 商品モデルを作る
1 |
php artisan make:model item --all |
2. テーブル定義する
1 2 3 4 5 6 7 8 |
Schema::create('items', function (Blueprint $table) { $table->id(); $table->string('name')->comment('商品名'); $table->integer('price')->comment('価格'); $table->boolean('food_flag')->default(false)->comment('食品フラグ'); $table->integer('taxed_price')->default(0)->comment('税込価格'); $table->timestamps(); }); |
3. ルーティング設定 routes/api.php
1 2 |
use App\Http\Controllers\ItemController; Route::apiResource('item', ItemController::class); |
postmanでInsertしようと、ポストしたら403エラー!
なんでかな?と思ったら、app\Http\Requests\StoreitemRequest.phpという新しいファイルが原因だった。
authorize() でtrueを返さないとINSERT出来ないらしい…。
1 2 3 4 5 6 7 8 9 10 11 12 |
class StoreitemRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { //return false; return true; } |
確かにItemController.phpをみたら、ただのrequestじゃなかった。
1 2 3 4 |
public function store(StoreitemRequest $request) { return item::create($request->all()); } |
マスアサイメントなんてものあったな…。
1 2 3 4 5 6 7 |
class item extends Model { use HasFactory; // システム系以外のカラムは、自由にinsert/updateしてOK! protected $guarded = ['id','created_at','updated_at','deleted_at']; } |
ようやく1レコードINSERTできた。本題のobeserverに入ろう。
4. ItemObserverを生成
Itemの所だけ、各モデル名に変更する
1 |
php artisan make:observer ItemObserver --model=Item |
app\Obeservers\ItemObserver.phpが生成された。
5. app\Providers\AppServiceProvider.phpに登録する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace App\Providers; // モデルとオブザーバーをUSE use App\Models\Item; use App\Observers\ItemObserver; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot() { // ここでモデルとオブザーバーを結びつける Item::observe(ItemObserver::class); } } |
6. ようやくCRUD処理をする時にCALLされる処理がコーディング出来る!
app\Obeservers\ItemObserver.php
1 2 3 4 5 6 7 8 9 10 11 |
public function created(Item $item) { //食品だったら消費税8%, それ以外は10% if($item->food_flag){ $rate = 0.08; }else{ $rate = 0.1; } $item->taxed_price = $item->price * $rate; $item->save(); } |
注意点!!
なぜかsaved()は用意されているのに、ItemObserver.phpには記述されていない!