Laravel 컨트롤러

Jmnote (토론 | 기여)님의 2024년 6월 30일 (일) 00:18 판

1 개요

Crystal Clear action info.png 작성 중인 문서입니다.
Controllers
컨트롤러

https://laravel.com/docs/11.x/controllers

2 소개

라우트 파일에서 모든 요청 처리 로직을 클로저로 정의하는 대신 "컨트롤러" 클래스를 사용하여 이러한 동작을 조직화할 수 있습니다. 컨트롤러는 관련된 요청 처리 로직을 하나의 클래스로 그룹화할 수 있습니다. 예를 들어, UserController 클래스는 사용자와 관련된 모든 들어오는 요청을 처리할 수 있습니다. 사용자의 표시, 생성, 업데이트, 삭제와 같은 작업이 포함될 수 있습니다. 기본적으로 컨트롤러는 app/Http/Controllers 디렉토리에 저장됩니다.

3 컨트롤러 작성

3.1 기본 컨트롤러

새로운 컨트롤러를 빠르게 생성하려면, make:controller Artisan 명령어를 실행할 수 있습니다. 기본적으로 애플리케이션의 모든 컨트롤러는 app/Http/Controllers 디렉토리에 저장됩니다:

php artisan make:controller UserController

기본 컨트롤러의 예제를 살펴보겠습니다. 컨트롤러는 들어오는 HTTP 요청에 응답할 수 있는 여러 개의 public 메서드를 가질 수 있습니다:

<?php
 
namespace App\Http\Controllers;
 
use App\Models\User;
use Illuminate\View\View;
 
class UserController extends Controller
{
    /**
     * 주어진 사용자의 프로필을 보여줍니다.
     */
    public function show(string $id): View
    {
        return view('user.profile', [
            'user' => User::findOrFail($id)
        ]);
    }
}

컨트롤러 클래스와 메소드를 작성한 후, 다음과 같이 컨트롤러 메소드에 대한 라우트를 정의할 수 있습니다:

use App\Http\Controllers\UserController;
 
Route::get('/user/{id}', [UserController::class, 'show']);

들어오는 요청이 지정된 라우트 URI와 매치하면, App\Http\Controllers\UserController 클래스의 show 메소드가 호출되고 라우트 매개변수가 메소드에 전달됩니다.

Note

컨트롤러는 기본 클래스를 확장할 필요는 없습니다. 그러나 모든 컨트롤러에서 공유되어야 하는 메소드를 포함하는 기본 컨트롤러 클래스를 확장하는 것이 편리할 때도 있습니다.

3.2 단일 액션 컨트롤러

컨트롤러 액션이 특히 복잡한 경우, 단일 액션을 위해 전체 컨트롤러 클래스를 전담하는 것이 편리할 수 있습니다. 이를 위해 컨트롤러 내에 단일 __invoke 메소드를 정의할 수 있습니다:

<?php

namespace App\Http\Controllers;

class ProvisionServer extends Controller
{
    /**
     * 새로운 웹 서버를 프로비저닝합니다.
     */
    public function __invoke()
    {
        // ...
    }
}

단일 액션 컨트롤러에 대한 라우트를 등록할 때는 컨트롤러 메소드를 지정할 필요가 없습니다. 대신, 컨트롤러의 이름만 라우터에 전달하면 됩니다:

use App\Http\Controllers\ProvisionServer;

Route::post('/server', ProvisionServer::class);

make:contoller Artisan 명령어의 --invokable 옵션을 사용하여 invokable 컨트롤러를 생성할 수 있습니다:

php artisan make:controller ProvisionServer --invokable

Note

컨트롤러 스텁은 스텁 커스터마이징|스텁 퍼블리싱을 통해 커스터마이징할 수 있습니다.

4 컨트롤러 미들웨어

미들웨어는 라우트 파일에서 컨트롤러의 라우트에 할당할 수 있습니다:

Route::get('profile', [UserController::class, 'show'])->middleware('auth');

또는, 컨트롤러 클래스 내에서 미들웨어를 지정하는 것이 편리할 수 있습니다. 이를 위해 컨트롤러는 HasMiddleware 인터페이스를 구현해야 하며, 이 인터페이스는 컨트롤러가 정적 middleware 메소드를 가져야 함을 명시합니다. 이 메소드에서 컨트롤러의 동작에 적용될 미들웨어 배열을 반환할 수 있습니다:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;

class UserController extends Controller implements HasMiddleware
{
    /**
     * 컨트롤러에 할당할 미들웨어를 가져옵니다.
     */
    public static function middleware(): array
    {
        return [
            'auth',
            new Middleware('log', only: ['index']),
            new Middleware('subscribed', except: ['store']),
        ];
    }

    // ...
}

컨트롤러 미들웨어를 클로저로 정의할 수도 있습니다. 이는 전체 미들웨어 클래스를 작성하지 않고 인라인 미들웨어를 정의하는 편리한 방법을 제공합니다:

use Closure;
use Illuminate\Http\Request;

/**
 * 컨트롤러에 할당할 미들웨어를 가져옵니다.
 */
public static function middleware(): array
{
    return [
        function (Request $request, Closure $next) {
            return $next($request);
        },
    ];
}

5 리소스 컨트롤러

5.1 부분 리소스 라우트

5.2 중첩 리소스

5.3 리소스 라우트 네이밍

5.4 밍명된 리소스 라우트 매개변수 네이밍

5.5 리소스 라우트 스코핑

5.6 리소스 URI 현지화

5.7 리소스 컨트롤러 보충

5.8 싱글톤 리소스 컨트롤러

6 의존성 주입과 컨트롤러

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}