가이드

훅(Hooks)은 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 - 모델이 저장되기 전에 실행되며, beforeStorebeforeUpdate 이후에 실행됩니다.
  • afterSave - 모델이 저장된 후에 실행되며, afterStoreafterUpdate 이전에 실행됩니다.
  • beforeDestroy - 모델을 조회하고 삭제하기 전에 실행됩니다.
  • afterDestroy - 모델을 삭제한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeRestore - 모델을 조회하고 복원하기 전에 실행됩니다.
  • afterRestore - 모델을 복원한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeFresh - 저장 후 모델이 새로고침되기 전에 실행되며, afterSaveafterStore 이전에 실행됩니다.

일괄 작업 훅:

  • beforeBatchStore - 새 모델들을 생성하기 전에 실행됩니다.
  • afterBatchStore - 새 모델들을 저장한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeBatchUpdate - 업데이트할 모델들을 조회하기 전에 실행됩니다.
  • afterBatchUpdate - 모델들을 업데이트한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeBatchDestroy - 삭제할 모델들을 조회하기 전에 실행됩니다.
  • afterBatchDestroy - 모델들을 삭제한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeBatchRestore - 복원할 모델들을 조회하기 전에 실행됩니다.
  • afterBatchRestore - 모델들을 복원한 후, 응답을 생성하기 전에 실행됩니다.
서로 연관된 "before" 및 "after" 훅(예: beforeStore, afterStore)과 beforeSave, afterSave는 일괄 작업에서도 각 모델마다 실행됩니다.

연관관계 컨트롤러의 훅

모든 유형: 연관관계 컨트롤러에는 모델 컨트롤러와 동일하게 CRUD 작업을 위한 before 및 after 훅이 있습니다.

일대다(One-to-many):

  • beforeAssociate - 두 모델을 모두 조회한 후, 자식 모델을 연결하기 전에 실행됩니다.
  • afterAssociate - 연결된 자식 모델 ID와 함께 연관관계 모델을 저장한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeDissociate - 두 모델을 모두 조회한 후, 자식 모델의 연결을 해제하기 전에 실행됩니다.
  • afterDissociate - 연결된 자식 모델 ID와 함께 연관관계 모델을 저장한 후, 응답을 생성하기 전에 실행됩니다.

다대다(Many-to-many):

  • beforeSync - 연관관계 모델을 조회하기 전에 실행됩니다.
  • afterSync - 연관된 모델들을 동기화한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeToggle - 연관관계 모델을 조회하기 전에 실행됩니다.
  • afterToggle - 연관된 모델들을 토글한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeAttach - 연관관계 모델을 조회하기 전에 실행됩니다.
  • afterAttach - 연관된 모델을 연관관계 모델에 연결(attach)한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeDetach - 연관관계 모델을 조회하기 전에 실행됩니다.
  • afterDetach - 연관된 모델을 연관관계 모델에서 분리(detach)한 후, 응답을 생성하기 전에 실행됩니다.
  • beforeUpdatePivot - 연관관계 모델을 조회하기 전에 실행됩니다.
  • afterUpdatePivot - 연관된 모델의 피벗을 업데이트한 후, 응답을 생성하기 전에 실행됩니다.