Laravel8 データベースアクセス時にイベントを設定する方法

例えば、あるテーブルに対してinsert or update時などに何か処理をしたい場合など。

イベントは以下の12種類

retrieved:データ取得時
creating:insert前
created:insert後
updating:update前
updated:update後
saving:insert or update前
saved:insert or update後
deleting:delete前
deleted:delete後
restoring:ソフトデリート前
restored:ソフトデリート後
replicating:複製前

各イベントの’ing’は直前、’ed’は直後を表すので、creatingの場合はinsert前に何かをしたい場合、createdの場合はinsert後に何かをしたい場合という風に使い分けることができる。

イベント作成

php artisan make:event イベント名

例)
php artisan make:event TestEcho

すると、app\Eventsフォルダに、TestEcho.phpファイルが作成される。

イベント編集

作成されたTestEcho.phpを開き、行いたい処理を__construct()内に記述する。

public function __construct()
{
    dd('creating');
}

イベント登録

対象モデルにdispatchesEventsの記述を行う。

protected $dispatchesEvents = [
    'リッスンするイベント' => \App\Events\イベントクラス::class
];

例)
class Member extends Model
{
  ・
  ・
  ・
    protected $dispatchesEvents = [
        'creating' => \App\Events\TestEcho::class
    ];
}

これでメンバー登録時、insert直前にddで’creating’出力される。

値を加工してinsertしたい場合

コンストラクタでモデルを受け取り、カラムに加工した値をセットすればOK。

use App\Models\Member;  // 追加
 ・
 ・
 ・
public function __construct(Member $member)
{
    $member->name = $member->name . 'さん';
}

特定のモデル(テーブル)に限定したくない場合

複数のテーブルに共通のカラムが存在し、共通の処理を行いたい場合はコンストラクタで受け取る型を指定しなければOK。

public function __construct($model)
{
    // なんらかの処理
     ・
     ・
     ・
    $model->共通カラム = 求めた値;
}

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です