최신판 |
당신의 편집 |
1번째 줄: |
1번째 줄: |
| ==개요== | | ==개요== |
| | {{작성중}} |
| [[분류: Laravel]] | | [[분류: Laravel]] |
| ;Controllers | | ;Controllers |
339번째 줄: |
340번째 줄: |
| </syntaxhighlight> | | </syntaxhighlight> |
|
| |
|
| ===자원 라우트 매개변수 이름지정=== | | ===밍명된 리소스 라우트 매개변수 네이밍=== |
| 기본적으로 <code>Route::resource</code>는 리소스 이름의 "단수형"을 기반으로 라우트 매개변수를 생성합니다. <code>parameters</code> 메소드를 사용하여 리소스별로 이를 쉽게 재정의할 수 있습니다. <code>parameters</code> 메소드에 전달된 배열은 리소스 이름과 매개변수 이름의 연관 배열이어야 합니다:
| | ===리소스 라우트 스코핑=== |
| | |
| <syntaxhighlight lang='php'>
| |
| use App\Http\Controllers\AdminUserController;
| |
|
| |
| Route::resource('users', AdminUserController::class)->parameters([
| |
| 'users' => 'admin_user'
| |
| ]);
| |
| </syntaxhighlight>
| |
| | |
| 위 예제는 리소스의 <code>show</code> 라우트에 대해 다음 URI를 생성합니다:
| |
| | |
| <syntaxhighlight lang='text'>
| |
| /users/{admin_user}
| |
| </syntaxhighlight>
| |
| | |
| ===리소스 라우트 스코프지정=== | |
| Laravel의 [[Laravel 라우팅#커스텀 키와 스코프지정|스코프 지정된 암시적 모델 바인딩]] 기능은 자식 모델이 부모 모델에 속하는지 자동으로 확인하도록 중첩된 바인딩의 스코프를 지정할 수 있습니다. 중첩된 리소스를 정의할 때 <code>scoped</code> 메소드를 사용하면 자동 스코프 지정이 가능해지며 자식 리소스를 어떤 필드로 조회할지 Laravel에 지시할 수 있습니다:
| |
| | |
| <syntaxhighlight lang='php'>
| |
| use App\Http\Controllers\PhotoCommentController;
| |
|
| |
| Route::resource('photos.comments', PhotoCommentController::class)->scoped([
| |
| 'comment' => 'slug',
| |
| ]);
| |
| </syntaxhighlight>
| |
| | |
| 이 라우트는 다음과 같은 URI로 접근할 수 있는 스코프가 지정된 중첩 리소스를 등록합니다:
| |
| | |
| <syntaxhighlight lang='text'>
| |
| /photos/{photo}/comments/{comment:slug}
| |
| </syntaxhighlight>
| |
| | |
| 커스텀 키 암시적 바인딩을 중첩된 라우트 매개변수로 사용할 때, Laravel은 관습에 따라 부모를 사용하여 중첩된 모델을 조회하기 위해 쿼리의 스코프를 자동으로 지정합니다. 이 경우, <code>Photo</code> 모델이 <code>Comment</code> 모델을 조회하는 데 사용할 수 있는 <code>comments</code>라는 관계(라우트 매개변수 이름의 복수형)를 가지고 있다고 가정합니다.
| |
| | |
| ===리소스 URI 현지화=== | | ===리소스 URI 현지화=== |
| 기본적으로, <code>Route::resource</code>는 영어 동사와 복수형 규칙을 사용하여 리소스 URI를 생성합니다. <code>create</code>와 <code>edit</code> 동사를 현지화해야 하는 경우, <code>Route::resourceVerbs</code> 메소드를 사용할 수 있습니다. 이는 애플리케이션의 <code>App\Providers\AppServiceProvider</code> 내의 <code>boot</code> 메소드 시작 부분에서 수행할 수 있습니다:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| /**
| |
| * 모든 애플리케이션 서비스를 부트스트랩합니다.
| |
| */
| |
| public function boot(): void
| |
| {
| |
| Route::resourceVerbs([
| |
| 'create' => 'crear',
| |
| 'edit' => 'editar',
| |
| ]);
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| Laravel의 복수형 변환기는 [[Laravel 현지화#복수형화 언어|여러 언어를 지원하며, 필요에 따라 설정]]할 수 있습니다. 동사와 복수형 언어를 커스터마이징한 후, <code>Route::resource('publicacion', PublicacionController::class)</code>와 같은 리소스 라우트 등록은 다음과 같은 URI를 생성합니다:
| |
|
| |
| <syntaxhighlight lang='text'>
| |
| /publicacion/crear
| |
|
| |
| /publicacion/{publicaciones}/editar
| |
| </syntaxhighlight>
| |
|
| |
| ===리소스 컨트롤러 보충=== | | ===리소스 컨트롤러 보충=== |
| 기본 리소스 라우트 집합 외에 리소스 컨트롤러에 추가 라우트를 추가해야 하는 경우, <code>Route::resource</code> 메소드를 호출하기 전에 해당 라우트를 정의해야 합니다. 그렇지 않으면 <code>resource</code> 메소드가 정의한 라우트가 의도치 않게 보충 라우트보다 우선할 수 있습니다.
| | ===싱글톤 리소스 컨트롤러=== |
| | |
| <syntaxhighlight lang='php'>
| |
| use App\Http\Controller\PhotoController;
| |
| | |
| Route::get('/photos/popular', [PhotoController::class, 'popular']);
| |
| Route::resource('photos', PhotoController::class);
| |
| </syntaxhighlight>
| |
| | |
| {{NOTE}}
| |
| 컨트롤러를 집중적으로 유지하는 것을 기억하세요. 일반적인 리소스 작업 집합 외의 메소드가 필요할 경우, 컨트롤러를 두 개의 더 작은 컨트롤러로 나누는 것을 고려해 보세요.
| |
| {{/NOTE}}
| |
| | |
| ===싱글턴 리소스 컨트롤러===
| |
| 때로는 애플리케이션에는 단일 인스턴스만 존재할 수 있는 리소스가 있을 수 있습니다. 예를 들어, 사용자의 "프로필"은 편집 또는 업데이트할 수 있지만 사용자는 하나의 "프로필"만 가질 수 있습니다. 마찬가지로 이미지에는 단일 "썸네일"이 있을 수 있습니다. 이러한 리소스를 "싱글턴 리소스"라고 하며, 이는 하나의 인스턴스만 존재할 수 있음을 의미합니다. 이러한 경우 "싱글턴" 리소스 컨트롤러를 등록할 수 있습니다:
| |
| | |
| <syntaxhighlight lang='php'>
| |
| use App\Http\Controllers\ProfileController;
| |
| use Illuminate\Support\Facades\Route;
| |
|
| |
| Route::singleton('profile', ProfileController::class);
| |
| </syntaxhighlight>
| |
| | |
| 위의 싱글턴 리소스 정의는 다음과 같은 라우트를 등록합니다. 보다시피, "생성" 라우트는 싱글턴 리소스에 대해 등록되지 않으며, 등록된 라우트는 단일 인스턴스만 존재할 수 있기 때문에 식별자를 필요로 하지 않습니다:
| |
| | |
| {| class='wikitable'
| |
| ! 동사 !! URI !! 액션 !! 라우트 이름
| |
| |-
| |
| | GET || <code>/profile</code> || show || profile.show
| |
| |-
| |
| | GET || <code>/profile/edit</code> || edit || profile.edit
| |
| |-
| |
| | PUT/PATCH || <code>/profile</code> || update || profile.update
| |
| |}
| |
| | |
| 싱글턴 리소스는 또한 표준 리소스 내에 중첩(nested)될 수도 있습니다:
| |
| | |
| <syntaxhighlight lang='php'>
| |
| Route::singleton('photos.thumbnail', ThumbnailController::class);
| |
| </syntaxhighlight>
| |
| | |
| 이 예시에서, <code>photos</code> 리소스는 모든 [[Laravel 컨트롤러#리소스 컨트롤러|표준 리소스 라우트]]를 받게 되지만, <code>thumbnail</code> 리소스는 다음과 같은 라우트를 갖는 싱글턴 리소스가 됩니다:
| |
| | |
| {| class='wikitable'
| |
| ! 동사 !! URI !! 액션 !! 라우트 이름
| |
| |-
| |
| | GET || <code>/photos/{photo}/thumbnail</code> || show || photos.thumbnail.show
| |
| |-
| |
| | GET || <code>/photos/{photo}/thumbnail/edit</code> || edit || photos.thumbnail.edit
| |
| |-
| |
| | PUT/PATCH || <code>/photos/{photo}/thumbnail</code> || update || photos.thumbnail.update
| |
| |}
| |
| | |
| ;생성가능한 싱글턴 리소스
| |
| | |
| 때로는, 싱글턴 리소스에 대해 생성 및 저장 라우트를 정의하고 싶을 때가 있습니다. 이를 위해 싱글턴 리소스 라우트를 등록할 때 <code>creatable</code> 메소드를 사용할 수 있습니다:
| |
| | |
| <syntaxhighlight lang='php'>
| |
| Route::singleton('photos.thumbnail', ThumbnailController::class)->creatable();
| |
| </syntaxhighlight>
| |
| | |
| 이 예시에서는, 다음과 같은 라우트가 등록됩니다. 보다시피, 생성가능한 싱글턴 리소스에 대해 <code>DELETE</code> 라우트도 등록됩니다:
| |
| | |
| {| class='wikitable'
| |
| ! 동사 !! URI !! 액션 !! 라우트 이름
| |
| |-
| |
| | GET || <code>/photos/{photo}/thumbnail/create</code> || create || photos.thumbnail.create
| |
| |-
| |
| | POST || <code>/photos/{photo}/thumbnail</code> || store || photos.thumbnail.store
| |
| |-
| |
| | GET || <code>/photos/{photo}/thumbnail</code> || show || photos.thumbnail.show
| |
| |-
| |
| | GET || <code>/photos/{photo}/thumbnail/edit</code> || edit || photos.thumbnail.edit
| |
| |-
| |
| | PUT/PATCH || <code>/photos/{photo}/thumbnail</code> || update || photos.thumbnail.update
| |
| |-
| |
| | DELETE || <code>/photos/{photo}/thumbnail</code> || destroy || photos.thumbnail.destroy
| |
| |}
| |
| | |
| Laravel이 싱글턴 리소스에 대해 <code>DELETE</code> 라우트를 등록하도록 하고 생성 또는 저장 라우트를 등록하지 않도록 하려면, <code>destroyable</code> 메소드를 사용할 수 있습니다:
| |
| | |
| <syntaxhighlight lang='php'>
| |
| Route::singleton(...)->destroyable();
| |
| </syntaxhighlight>
| |
| | |
| ;API 싱글턴 리소스
| |
| <code>apiSingleton</code> 메소드는 API를 통해 조작할 싱글턴 리소스를 등록하는 데 사용할 수 있으며, 이로 인해 <code>create</code>와 <code>edit</code> 라우트가 필요하지 않게 됩니다:
| |
| | |
| <syntaxhighlight lang='php'>
| |
| Route::apiSingleton('profile', ProfileController::class);
| |
| </syntaxhighlight>
| |
| | |
| 물론, API 싱글턴 리소스는 <code>createble</code>(생성가능)일 수도 있으며, 그런 경우 리소스에 대해 <code>store</code>와 <code>destroy</code> 라우트가 등록됩니다:
| |
| | |
| <syntaxhighlight lang='php'>
| |
| Route::apiSingleton('photos.thumbnail', ProfileController::class)->creatable();
| |
| </syntaxhighlight>
| |
|
| |
|
| ==의존성 주입과 컨트롤러== | | ==의존성 주입과 컨트롤러== |
| ;생성자 주입
| |
| [[Laravel 서비스 컨테이너]]는 모든 Laravel 컨트롤러를 해결하는 데 사용됩니다. 따라서 컨트롤러가 필요로 하는 모든 의존성을 생성자에 타입 힌트를 사용하여 선언할 수 있습니다. 선언된 의존성은 자동으로 해결되고 컨트롤러 인스턴스에 주입됩니다:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| <?php
| |
|
| |
| namespace App\Http\Controllers;
| |
|
| |
| use App\Repositories\UserRepository;
| |
|
| |
| class UserController extends Controller
| |
| {
| |
| /**
| |
| * 새로운 컨트롤러 인스턴스를 생성합니다.
| |
| */
| |
| public function __construct(
| |
| protected UserRepository $users,
| |
| ) {}
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| ;메소드 주입
| |
| 생성자 주입 외에도 컨트롤러의 메소드에 의존성을 타입 힌트로 선언할 수 있습니다. 메소드 주입의 일반적인 사용 사례는 <code>Illuminate\Http\Request</code> 인스턴스를 컨트롤러 메소드에 주입하는 것입니다:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| <?php
| |
|
| |
| namespace App\Http\Controllers;
| |
|
| |
| use Illuminate\Http\RedirectResponse;
| |
| use Illuminate\Http\Request;
| |
|
| |
| class UserController extends Controller
| |
| {
| |
| /**
| |
| * 새로운 사용자를 저장합니다.
| |
| */
| |
| public function store(Request $request): RedirectResponse
| |
| {
| |
| $name = $request->name;
| |
|
| |
| // 사용자 저장...
| |
|
| |
| return redirect('/users');
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| 컨트롤러 메소드가 라우트 매개변수에서 입력도 기대하는 경우, 다른 의존성 뒤에 라우트 인수를 나열하십시오. 예를 들어, 라우트가 다음과 같이 정의된 경우:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| use App\Http\Controllers\UserController;
| |
|
| |
| Route::put('/user/{id}', [UserController::class, 'update']);
| |
| </syntaxhighlight>
| |
|
| |
| <code>Illuminate\Http\Request</code>를 타입 힌트로 사용하고 <code>id</code> 매개변수에 접근하려면 다음과 같이 컨트롤러 메소드를 정의할 수 있습니다:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| <?php
| |
|
| |
| namespace App\Http\Controllers;
| |
|
| |
| use Illuminate\Http\RedirectResponse;
| |
| use Illuminate\Http\Request;
| |
|
| |
| class UserController extends Controller
| |
| {
| |
| /**
| |
| * 주어진 사용자를 업데이트합니다.
| |
| */
| |
| public function update(Request $request, string $id): RedirectResponse
| |
| {
| |
| // 사용자 업데이트...
| |
|
| |
| return redirect('/users');
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |