Laravel Folio는 Blade 파일을 배치하는 것만으로 라우트를 정의할 수 있는 페이지 기반 라우터입니다.
기존 routes/web.php 중심의 정의와 달리 파일 시스템 구조를 그대로 URL에 반영할 수 있습니다.
콘텐츠 중심의 사이트나 화면마다 빠르게 페이지를 추가하고 싶은 관리 화면에서 특히 효과적입니다.
API처럼 세밀한 HTTP 제어가 필요한 영역은 일반 라우팅과 병용하는 것이 실용적입니다.
먼저 Composer로 Folio를 추가합니다.
composer require laravel/folio
php artisan folio:install
folio:install은 Folio의 서비스 프로바이더를 등록합니다.
기본적으로 resources/views/pages/가 페이지 디렉터리가 됩니다.
여러 페이지 디렉터리나 베이스 URI를 구분해서 사용하는 경우, 서비스 프로바이더의 boot에서 Folio::path()와 uri()를 설정합니다.
use Laravel\Folio\Folio;
Folio::path(resource_path('views/pages/guest'))->uri('/');
Folio::path(resource_path('views/pages/admin'))
->uri('/admin');
라우트 생성
Folio는 마운트된 디렉터리 아래의 Blade 파일명에서 URL을 자동으로 생성합니다.
resources/views/pages/schedule.blade.php -> /schedule
중첩된 라우트
디렉터리를 중첩하면 URL도 같은 구조로 중첩됩니다.
php artisan folio:page user/profile
# pages/user/profile.blade.php -> /user/profile
인덱스 라우트
index.blade.php는 해당 디렉터리의 루트에 매핑됩니다.
php artisan folio:page index
# pages/index.blade.php -> /
php artisan folio:page users/index
# pages/users/index.blade.php -> /users
라우트 파라미터
파일명의 []로 URL 세그먼트를 받을 수 있습니다.
php artisan folio:page "users/[id]"
# pages/users/[id].blade.php -> /users/1
<div>User {{ $id }}</div>
여러 세그먼트를 받는 경우에는 ...을 사용합니다.
php artisan folio:page "users/[...ids]"
# pages/users/[...ids].blade.php -> /users/1/2/3
@foreach ($ids as $id)
<li>User {{ $id }}</li>
@endforeach
라우트 모델 바인딩
[User].blade.php처럼 모델명을 사용하면 자동으로 모델 해석됩니다.
php artisan folio:page "users/[User]"
# pages/users/[User].blade.php -> /users/1
<div>User {{ $user->id }}</div>
소프트 삭제된 모델도 다루는 경우, 페이지 안에서 withTrashed()를 호출합니다.
<?php
use function Laravel\Folio\withTrashed;
withTrashed();
[Post:slug].blade.php처럼 작성하면 id 이외의 키(예: slug)로도 모델 해석이 가능합니다.
미들웨어
특정 페이지에만 적용하는 경우, 페이지 템플릿 안에서 middleware()를 사용합니다.
<?php
use function Laravel\Folio\middleware;
middleware(['auth', 'verified']);
여러 페이지에 일괄 적용하는 경우에는 Folio::path(...)->middleware()를 사용합니다.
<?php
use Laravel\Folio\Folio;
Folio::path(resource_path('views/pages'))->middleware([
'admin/*' => ['auth', 'verified'],
]);
이름 지정 라우트
Folio 페이지에도 name()으로 라우트 이름을 붙일 수 있습니다.
<?php
use function Laravel\Folio\name;
name('users.index');
users/[User].blade.php처럼 개별 페이지 쪽에서 name('users.show')를 정의하면, 파라미터가 포함된 URL을 route('users.show', ['user' => $user])로 생성할 수 있습니다.
부여한 라우트 이름은 route() 헬퍼로 URL을 생성할 수 있습니다.
route('users.index');
route('users.show', ['user' => $user]);
파일과 URL의 대응
기존 라우팅과의 비교
| 특징 | 일반 라우팅 | Folio |
|---|
| 라우트 정의 | routes/web.php | 파일명으로 자동 |
| 컨트롤러 | 필요(또는 클로저) | 불필요(Blade에 직접) |
| 적합한 사례 | API나 SPA, 복잡한 HTTP 제어 | 콘텐츠 사이트, 관리 화면 |
Folio를 사용하는 경우에도 php artisan route:cache로 라우트 캐시를 활성화하면 프로덕션 성능을 최적화할 수 있습니다.