Skip to content

[핵심개념] 렌더 훅

개요

Filament는 프레임워크의 뷰에서 다양한 지점에 Blade 콘텐츠를 렌더링할 수 있도록 지원합니다. 이는 플러그인이 프레임워크에 HTML을 주입할 수 있도록 하는 데 유용합니다. 또한, Filament는 뷰를 퍼블리시하는 것을 권장하지 않으므로(변경 사항으로 인해 깨질 위험이 높아지기 때문), 사용자에게도 유용합니다.

렌더 후크 등록하기

렌더 후크를 등록하려면 서비스 프로바이더나 미들웨어에서 FilamentView::registerRenderHook()을 호출하면 됩니다. 첫 번째 인자는 렌더 후크의 이름이고, 두 번째 인자는 렌더링할 콘텐츠를 반환하는 콜백입니다:

php
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;
use Illuminate\Support\Facades\Blade;

FilamentView::registerRenderHook(
    PanelsRenderHook::BODY_START,
    fn (): string => Blade::render('@livewire(\'livewire-ui-modal\')'),
);

파일에서 뷰 콘텐츠를 렌더링할 수도 있습니다:

php
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;
use Illuminate\Contracts\View\View;

FilamentView::registerRenderHook(
    PanelsRenderHook::BODY_START,
    fn (): View => view('impersonation-banner'),
);

사용 가능한 렌더 후크

패널 빌더 렌더 후크

php
    use Filament\View\PanelsRenderHook;

테이블 빌더 렌더 후크

이 모든 렌더 후크는 범위 지정하여 테이블 Livewire 컴포넌트 클래스에 적용할 수 있습니다. 패널 빌더를 사용할 때, 이 클래스들은 리소스의 List 또는 Manage 페이지이거나 관계 매니저일 수 있습니다. 테이블 위젯도 Livewire 컴포넌트 클래스입니다.

php
    use Filament\Tables\View\TablesRenderHook;
  • TablesRenderHook::SELECTION_INDICATOR_ACTIONS_AFTER - 선택 인디케이터 바에서 "전체 선택" 및 "전체 선택 해제" 액션 버튼 이후
  • TablesRenderHook::SELECTION_INDICATOR_ACTIONS_BEFORE - 선택 인디케이터 바에서 "전체 선택" 및 "전체 선택 해제" 액션 버튼 이전
  • TablesRenderHook::HEADER_AFTER - 헤더 컨테이너 이후
  • TablesRenderHook::HEADER_BEFORE - 헤더 컨테이너 이전
  • TablesRenderHook::TOOLBAR_AFTER - 툴바 컨테이너 이후
  • TablesRenderHook::TOOLBAR_BEFORE - 툴바 컨테이너 이전
  • TablesRenderHook::TOOLBAR_END - 툴바의 끝
  • TablesRenderHook::TOOLBAR_GROUPING_SELECTOR_AFTER - 그룹화 셀렉터 이후
  • TablesRenderHook::TOOLBAR_GROUPING_SELECTOR_BEFORE - 그룹화 셀렉터 이전
  • TablesRenderHook::TOOLBAR_REORDER_TRIGGER_AFTER - 정렬 변경 트리거 이후
  • TablesRenderHook::TOOLBAR_REORDER_TRIGGER_BEFORE - 정렬 변경 트리거 이전
  • TablesRenderHook::TOOLBAR_SEARCH_AFTER - 검색 컨테이너 이후
  • TablesRenderHook::TOOLBAR_SEARCH_BEFORE - 검색 컨테이너 이전
  • TablesRenderHook::TOOLBAR_START - 툴바의 시작
  • TablesRenderHook::TOOLBAR_TOGGLE_COLUMN_TRIGGER_AFTER - 컬럼 토글 트리거 이후
  • TablesRenderHook::TOOLBAR_TOGGLE_COLUMN_TRIGGER_BEFORE - 컬럼 토글 트리거 이전

위젯 렌더 후크

php
    use Filament\Widgets\View\WidgetsRenderHook;

렌더 후크 범위 지정하기

일부 렌더 후크는 "범위(scope)"를 지정할 수 있어, 특정 페이지나 Livewire 컴포넌트에서만 출력되도록 할 수 있습니다. 예를 들어, 한 페이지만을 위한 렌더 후크를 등록하고 싶을 수 있습니다. 이 경우, registerRenderHook()의 두 번째 인자로 페이지나 컴포넌트의 클래스를 전달하면 됩니다:

php
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;
use Illuminate\Support\Facades\Blade;

FilamentView::registerRenderHook(
    PanelsRenderHook::PAGE_START,
    fn (): View => view('warning-banner'),
    scopes: \App\Filament\Resources\UserResource\Pages\EditUser::class,
);

렌더 후크를 등록할 범위 배열을 전달할 수도 있습니다:

php
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;

FilamentView::registerRenderHook(
    PanelsRenderHook::PAGE_START,
    fn (): View => view('warning-banner'),
    scopes: [
        \App\Filament\Resources\UserResource\Pages\CreateUser::class,
        \App\Filament\Resources\UserResource\Pages\EditUser::class,
    ],
);

패널 빌더의 일부 렌더 후크는 리소스의 모든 페이지에 후크를 범위 지정할 수 있습니다:

php
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;

FilamentView::registerRenderHook(
    PanelsRenderHook::PAGE_START,
    fn (): View => view('warning-banner'),
    scopes: \App\Filament\Resources\UserResource::class,
);

렌더 후크 내부에서 현재 활성화된 범위 가져오기

$scopes는 렌더 후크 함수에 전달되며, 이를 사용하여 렌더 후크가 어느 페이지나 컴포넌트에서 렌더링되고 있는지 확인할 수 있습니다:

php
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;

FilamentView::registerRenderHook(
    PanelsRenderHook::PAGE_START,
    fn (array $scopes): View => view('warning-banner', ['scopes' => $scopes]),
    scopes: \App\Filament\Resources\UserResource::class,
);

후크 렌더링하기

플러그인 개발자는 사용자에게 렌더 후크를 노출하는 것이 유용할 수 있습니다. 어디에도 등록할 필요 없이, Blade에서 다음과 같이 출력하면 됩니다:

blade
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::PAGE_START) }}

렌더 후크에 범위를 제공하려면, renderHook()의 두 번째 인자로 전달할 수 있습니다. 예를 들어, 후크가 Livewire 컴포넌트 내부에 있다면, static::class를 사용하여 컴포넌트의 클래스를 전달할 수 있습니다:

blade
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::PAGE_START, scopes: $this->getRenderHookScopes()) }}

여러 범위를 배열로 전달할 수도 있으며, 범위 중 하나라도 일치하는 모든 렌더 후크가 렌더링됩니다:

blade
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::PAGE_START, scopes: [static::class, \App\Filament\Resources\UserResource::class]) }}

나를 위한 문서 한글화