가이드
훅
훅(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());
}
}
트랜잭션
기본적으로 훅에서 실행되는 쿼리와 작업 자체의 쿼리(예: 엔티티 업데이트)는 트랜잭션으로 감싸지지 않습니다. 다음 방법으로 이 동작을 쉽게 변경할 수 있습니다.
orion.php설정 파일에서transactions.enabled를true로 설정 — 모든 컨트롤러에 적용됩니다- 더 세밀한 제어가 필요하다면 개별 컨트롤러에서
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" 훅(예:
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 - 연관된 모델의 피벗을 업데이트한 후, 응답을 생성하기 전에 실행됩니다.