Laravel Folio
소개
Laravel Folio는 Laravel 애플리케이션에서 라우팅을 단순화하도록 설계된 강력한 페이지 기반 라우터입니다. Laravel Folio를 사용하면 애플리케이션의 resources/views/pages 디렉토리 내에 Blade 템플릿을 생성하는 것만큼 쉽게 라우트를 생성할 수 있습니다.
예를 들어 /greeting URL에서 접근할 수 있는 페이지를 만들려면 애플리케이션의 resources/views/pages 디렉토리에 greeting.blade.php 파일을 생성하기만 하면 됩니다.
<div> Hello World</div>
설치
시작하려면 Composer 패키지 관리자를 사용하여 Folio를 프로젝트에 설치하십시오.
composer require laravel/folio
Folio를 설치한 후 folio:install Artisan 명령을 실행하여 Folio의 서비스 제공자를 애플리케이션에 설치할 수 있습니다. 이 서비스 제공자는 Folio가 라우트/페이지를 검색할 디렉토리를 등록합니다.
php artisan folio:install
페이지 경로 / URI
기본적으로 Folio는 애플리케이션의 resources/views/pages 디렉토리에서 페이지를 제공하지만, Folio 서비스 제공자의 boot 메소드에서 이러한 디렉토리를 사용자 정의할 수 있습니다.
예를 들어, 때로는 동일한 Laravel 애플리케이션에서 여러 Folio 경로를 지정하는 것이 편리할 수 있습니다. 애플리케이션의 "admin" 영역에 대한 Folio 페이지의 별도 디렉토리를 사용하고, 나머지 애플리케이션 페이지에 대해서는 다른 디렉토리를 사용하고 싶을 수 있습니다.
Folio::path 및 Folio::uri 메소드를 사용하여 이를 수행할 수 있습니다. path 메소드는 들어오는 HTTP 요청을 라우팅할 때 Folio가 페이지를 검색할 디렉토리를 등록하는 반면, uri 메소드는 해당 페이지 디렉토리의 "기본 URI"를 지정합니다.
use Laravel\Folio\Folio; Folio::path(resource_path('views/pages/guest'))->uri('/'); Folio::path(resource_path('views/pages/admin')) ->uri('/admin') ->middleware([ '*' => [ 'auth', 'verified', // ... ], ]);
서브도메인 라우팅
들어오는 요청의 서브도메인을 기반으로 페이지를 라우팅할 수도 있습니다. 예를 들어, admin.example.com의 요청을 나머지 Folio 페이지와 다른 페이지 디렉토리로 라우팅하고 싶을 수 있습니다. Folio::path 메소드를 호출한 후 domain 메소드를 호출하여 이를 수행할 수 있습니다.
use Laravel\Folio\Folio; Folio::domain('admin.example.com') ->path(resource_path('views/pages/admin'));
domain 메소드를 사용하면 도메인 또는 서브도메인의 일부를 매개변수로 캡처할 수도 있습니다. 이러한 매개변수는 페이지 템플릿에 주입됩니다.
use Laravel\Folio\Folio; Folio::domain('{account}.example.com') ->path(resource_path('views/pages/admin'));
라우트 생성하기
Folio 마운트 디렉터리에 Blade 템플릿을 배치하여 Folio 라우트를 생성할 수 있습니다. 기본적으로 Folio는 resources/views/pages 디렉터리를 마운트하지만, Folio 서비스 제공자의 boot 메서드에서 이러한 디렉터리를 사용자 정의할 수 있습니다.
Blade 템플릿이 Folio 마운트 디렉터리에 배치되면 브라우저를 통해 즉시 액세스할 수 있습니다. 예를 들어 pages/schedule.blade.php에 배치된 페이지는 브라우저에서 http://example.com/schedule로 액세스할 수 있습니다.
Folio 페이지/라우트의 모든 목록을 빠르게 보려면 folio:list Artisan 명령을 호출할 수 있습니다.
php artisan folio:list
중첩된 라우트
Folio 디렉터리 내에 하나 이상의 디렉터리를 만들어 중첩된 라우트를 만들 수 있습니다. 예를 들어 /user/profile을 통해 액세스할 수 있는 페이지를 만들려면 pages/user 디렉터리 내에 profile.blade.php 템플릿을 만드십시오.
php artisan folio:page user/profile # pages/user/profile.blade.php → /user/profile
인덱스 라우트
때로는 특정 페이지를 디렉터리의 "인덱스"로 만들고 싶을 수 있습니다. Folio 디렉터리 내에 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 세그먼트를 페이지에 삽입하여 상호 작용해야 할 수 있습니다. 예를 들어 프로필이 표시되는 사용자의 "ID"에 액세스해야 할 수 있습니다. 이를 위해 페이지 파일 이름의 세그먼트를 대괄호로 묶을 수 있습니다.
php artisan folio:page "users/[id]" # pages/users/[id].blade.php → /users/1
캡처된 세그먼트는 Blade 템플릿 내에서 변수로 액세스할 수 있습니다.
<div> User {{ $id }}</div>
여러 세그먼트를 캡처하려면 캡슐화된 세그먼트 앞에 세 개의 점 ...을 접두사로 붙일 수 있습니다.
php artisan folio:page "users/[...ids]" # pages/users/[...ids].blade.php → /users/1/2/3
여러 세그먼트를 캡처할 때, 캡처된 세그먼트는 배열로 페이지에 주입됩니다.
<ul> @foreach ($ids as $id) <li>User {{ $id }}</li> @endforeach</ul>
라우트 모델 바인딩
페이지 템플릿 파일 이름의 와일드카드 세그먼트가 애플리케이션의 Eloquent 모델 중 하나와 일치하면, Folio는 자동으로 라라벨의 라우트 모델 바인딩 기능을 활용하여 해결된 모델 인스턴스를 페이지에 주입하려고 시도합니다.
php artisan folio:page "users/[User]" # pages/users/[User].blade.php → /users/1
캡처된 모델은 Blade 템플릿 내에서 변수로 액세스할 수 있습니다. 모델의 변수 이름은 "카멜 케이스"로 변환됩니다.
<div> User {{ $user->id }}</div>
키 사용자 정의
때로는 id 이외의 열을 사용하여 바인딩된 Eloquent 모델을 해결하고 싶을 수도 있습니다. 그렇게 하려면 페이지의 파일 이름에 열을 지정할 수 있습니다. 예를 들어 파일 이름이 [Post:slug].blade.php인 페이지는 id 열 대신 slug 열을 통해 바인딩된 모델을 해결하려고 시도합니다.
Windows에서는 모델 이름과 키를 분리하기 위해 -를 사용해야 합니다. [Post-slug].blade.php와 같이 사용합니다.
모델 위치
기본적으로 Folio는 애플리케이션의 app/Models 디렉토리 내에서 모델을 검색합니다. 그러나 필요한 경우 템플릿 파일 이름에 정규화된 모델 클래스 이름을 지정할 수 있습니다.
php artisan folio:page "users/[.App.Models.User]" # pages/users/[.App.Models.User].blade.php → /users/1
소프트 삭제된 모델
기본적으로, 소프트 삭제된 모델은 암시적 모델 바인딩을 해결할 때 검색되지 않습니다. 그러나 원하는 경우 페이지의 템플릿 내에서 withTrashed 함수를 호출하여 Folio가 소프트 삭제된 모델을 검색하도록 지시할 수 있습니다.
<?php use function Laravel\Folio\{withTrashed}; withTrashed(); ?> <div> User {{ $user->id }}</div>
렌더 훅
기본적으로 Folio는 들어오는 요청에 대한 응답으로 페이지의 Blade 템플릿 내용을 반환합니다. 그러나 페이지의 템플릿 내에서 render 함수를 호출하여 응답을 사용자 정의할 수 있습니다.
render 함수는 Folio에서 렌더링하는 View 인스턴스를 받는 클로저를 허용하여 뷰에 추가 데이터를 추가하거나 전체 응답을 사용자 정의할 수 있습니다. View 인스턴스를 받는 것 외에도 추가적인 라우트 매개변수 또는 모델 바인딩도 render 클로저에 제공됩니다.
<?php use App\Models\Post;use Illuminate\Support\Facades\Auth;use Illuminate\View\View; use function Laravel\Folio\render; render(function (View $view, Post $post) { if (! Auth::user()->can('view', $post)) { return response('Unauthorized', 403); } return $view->with('photos', $post->author->photos);}); ?> <div> {{ $post->content }}</div> <div> This author has also taken {{ count($photos) }} photos.</div>
명명된 라우트
name 함수를 사용하여 주어진 페이지의 라우트에 이름을 지정할 수 있습니다.
<?php use function Laravel\Folio\name; name('users.index');
Laravel의 명명된 라우트와 마찬가지로 route 함수를 사용하여 이름이 할당된 Folio 페이지의 URL을 생성할 수 있습니다.
<a href="{{ route('users.index') }}"> All Users</a>
페이지에 매개변수가 있는 경우 해당 값을 route 함수에 전달하기만 하면 됩니다.
route('users.show', ['user' => $user]);
미들웨어
페이지 템플릿 내에서 middleware 함수를 호출하여 특정 페이지에 미들웨어를 적용할 수 있습니다.
<?php use function Laravel\Folio\{middleware}; middleware(['auth', 'verified']); ?> <div> 대시보드</div>
또는 페이지 그룹에 미들웨어를 할당하려면 Folio::path 메서드를 호출한 후 middleware 메서드를 체이닝할 수 있습니다.
미들웨어를 적용해야 하는 페이지를 지정하기 위해, 미들웨어 배열은 해당 미들웨어가 적용되어야 하는 페이지의 해당 URL 패턴을 사용하여 키를 지정할 수 있습니다. * 문자는 와일드카드 문자로 활용될 수 있습니다.
use Laravel\Folio\Folio; Folio::path(resource_path('views/pages'))->middleware([ 'admin/*' => [ 'auth', 'verified', // ... ],]);
인라인 익명 미들웨어를 정의하기 위해 미들웨어 배열에 클로저를 포함할 수 있습니다.
use Closure;use Illuminate\Http\Request;use Laravel\Folio\Folio; Folio::path(resource_path('views/pages'))->middleware([ 'admin/*' => [ 'auth', 'verified', function (Request $request, Closure $next) { // ... return $next($request); }, ],]);
라우트 캐싱
Folio를 사용할 때 항상 라라벨의 라우트 캐싱 기능을 활용해야 합니다. Folio는 최대 성능을 위해 Folio 페이지 정의 및 라우트 이름이 올바르게 캐시되도록 route:cache Artisan 명령을 수신합니다.