ガイド

フック

Orionの強力な機能のひとつがフックです。メソッド自体をオーバーライドすることなく、特定のエンドポイント(または複数のエンドポイント)内の処理フローに割り込むことができます。

よくあるユースケースを紹介します。ブログ記事用のAPIコントローラーがあり、ブログ記事が作成されるたびに、現在認証されているユーザーと関連付ける必要があるとします。これを実現するには、beforeSaveフックを追加して、ユーザーを記事に関連付けるだけです。

<?php

namespace App\Http\Controllers\Api;

use App\Models\Post;
use Orion\Http\Requests\Request;
use Orion\Http\Controllers\Controller;

class PostsController extends Controller
{
    /**
     * @var string|null $model
     */
    protected $model = Post::class;

    /**
     * @param Request $request
     * @param Post $post
     */
    protected function beforeSave(Request $request, $post)
    {
        $post->user()->associate($request->user());
    }
}

トランザクション

デフォルトでは、フック内で実行されるクエリと操作自体のクエリ(たとえばエンティティの更新)はトランザクションでラップされません。この挙動は次の方法で簡単に変更できます。

  1. orion.php設定ファイルでtransactions.enabledtrueに設定します。これはすべてのコントローラーに影響します
  2. より細かく制御するには、任意のコントローラーでtransactionsAreEnabledメソッドをオーバーライドします

モデルコントローラーのフック

  • beforeIndex - モデルの一覧を取得する前に実行されます。
  • afterIndex - モデルの一覧を取得した後、レスポンスを構築する前に実行されます。
  • beforeShow - モデルを取得する前に実行されます。
  • afterShow - モデルを取得した後、レスポンスを構築する前に実行されます。
  • beforeStore - 新しいモデルインスタンスを作成して属性を設定する前に実行されます。
  • afterStore - モデルを保存した後、レスポンスを構築する前に実行されます。
  • beforeUpdate - モデルを取得して属性を設定する前に実行されます。
  • afterUpdate - モデルを更新した後、レスポンスを構築する前に実行されます。
  • beforeSave - モデルが保存される前、ただしbeforeStoreおよびbeforeUpdateの後に実行されます。
  • afterSave - モデルが保存された後、ただしafterStoreおよびafterUpdateの前に実行されます。
  • beforeDestroy - モデルを取得して削除する前に実行されます。
  • afterDestroy - モデルを削除した後、レスポンスを構築する前に実行されます。
  • beforeRestore - モデルを取得して復元する前に実行されます。
  • afterRestore - モデルを復元した後、レスポンスを構築する前に実行されます。
  • beforeFresh - 保存後にモデルがリフレッシュされる前、かつafterSaveおよびafterStoreの前に実行されます。

バッチ操作のフック:

  • beforeBatchStore - 新しいモデルを作成する前に実行されます。
  • afterBatchStore - 新しいモデルを保存した後、レスポンスを構築する前に実行されます。
  • beforeBatchUpdate - 更新対象のモデルを取得する前に実行されます。
  • afterBatchUpdate - モデルを更新した後、レスポンスを構築する前に実行されます。
  • beforeBatchDestroy - 削除対象のモデルを取得する前に実行されます。
  • afterBatchDestroy - モデルを削除した後、レスポンスを構築する前に実行されます。
  • beforeBatchRestore - 復元対象のモデルを取得する前に実行されます。
  • afterBatchRestore - モデルを復元した後、レスポンスを構築する前に実行されます。
対応する「before」および「after」フック(たとえばbeforeStoreafterStore)と、beforeSaveおよびafterSaveは、バッチ操作でも各モデルごとに実行されます。

リレーションコントローラーのフック

全タイプ共通: リレーションコントローラーには、モデルコントローラーと同様に、CRUD操作のbeforeフックとafterフックがあります。

1対多:

  • beforeAssociate - 両方のモデルを取得した後、子モデルを関連付ける前に実行されます。
  • afterAssociate - 関連付けられた子モデルのidとともにリレーションモデルを保存した後、レスポンスを構築する前に実行されます。
  • beforeDissociate - 両方のモデルを取得した後、子モデルの関連付けを解除する前に実行されます。
  • afterDissociate - 関連付けられた子モデルのidとともにリレーションモデルを保存した後、レスポンスを構築する前に実行されます。

多対多:

  • beforeSync - リレーションモデルを取得する前に実行されます。
  • afterSync - 関連モデルをsyncした後、レスポンスを構築する前に実行されます。
  • beforeToggle - リレーションモデルを取得する前に実行されます。
  • afterToggle - 関連モデルをtoggleした後、レスポンスを構築する前に実行されます。
  • beforeAttach - リレーションモデルを取得する前に実行されます。
  • afterAttach - 関連モデルをリレーションモデルにattachした後、レスポンスを構築する前に実行されます。
  • beforeDetach - リレーションモデルを取得する前に実行されます。
  • afterDetach - 関連モデルをリレーションモデルからdetachした後、レスポンスを構築する前に実行されます。
  • beforeUpdatePivot - リレーションモデルを取得する前に実行されます。
  • afterUpdatePivot - 関連モデルのピボットを更新した後、レスポンスを構築する前に実行されます。