Laravel 컨트롤러 편집하기

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
1번째 줄: 1번째 줄:
==개요==
==개요==
{{작성중}}
[[분류: Laravel]]
[[분류: Laravel]]
;Controllers
;Controllers
339번째 줄: 340번째 줄:
</syntaxhighlight>
</syntaxhighlight>


===자원 라우트 매개변수 이름지정===
;자원 라우트 매개변수 이름지정
기본적으로 <code>Route::resource</code>는 리소스 이름의 "단수형"을 기반으로 라우트 매개변수를 생성합니다. <code>parameters</code> 메소드를 사용하여 리소스별로 이를 쉽게 재정의할 수 있습니다. <code>parameters</code> 메소드에 전달된 배열은 리소스 이름과 매개변수 이름의 연관 배열이어야 합니다:
기본적으로 <code>Route::resource</code>는 리소스 이름의 "단수형"을 기반으로 라우트 매개변수를 생성합니다. <code>parameters</code> 메소드를 사용하여 리소스별로 이를 쉽게 재정의할 수 있습니다. <code>parameters</code> 메소드에 전달된 배열은 리소스 이름과 매개변수 이름의 연관 배열이어야 합니다:


356번째 줄: 357번째 줄:
</syntaxhighlight>
</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>

제타위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 제타위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 편집 도움말 (새 창에서 열림)

이 문서에서 사용한 틀: