Laravel Controller

정종일·2023년 10월 24일
0

Laravel

목록 보기
9/9

Writing Controllers

Basic Controllers

php artisan make:controller UserController : 컨트롤러 생성

<?php
 
namespace App\Http\Controllers;
 
use App\Models\User;
use Illuminate\View\View;
 
class UserController extends Controller
{
    /**
     * Show the profile for a given user.
     */
    public function show(string $id): View
    {
        return view('user.profile', [
            'user' => User::findOrFail($id)
        ]);
    }
}

컨트롤러의 여러 메서드를 작성한 후에는 route 파일에 작성 가능하다

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

❗ Controller 클래스를 extends하는 것은 필수는 아니지만 확장하지 않으면 middleware, authorize 등의 기능은 사용할 수 없다

Single Action Controllers

<?php
 
namespace App\Http\Controllers;
 
use App\Models\User;
use Illuminate\Http\Response;
 
class ProvisionServer extends Controller
{
    /**
     * Provision a new web server.
     */
    public function __invoke()
    {
        // ...
    }
}

💡 Single Action으로만 등록하는 경우 컨트롤러 내 메서드 이름은 명시할 필요 없음

use App\Http\Controllers\ProvisionServer;
 
Route::post('/server', ProvisionServer::class);

Controller Middleware

미들웨어를 컨트롤러에 할당할 수 있다

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

미들웨어를 개별적으로 할당할 수 있는데

class UserController extends Controller
{
    /**
     * Instantiate a new controller instance.
     */
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('log')->only('index');
        $this->middleware('subscribed')->except('store');
    }
}

이처럼 특정 컨트롤러만 할당, 제외가 가능하다

Resource Controllers

흔히 사용되는 CRUD 메서드들을 resources 속성을 통해 사용 가능하다

Partial Resource Routes

CRUD 메서드 가운데 사용할 메서드만 정의, 혹은 사용하지 않을 메서드만 정의할 수 있다

use App\Http\Controllers\PhotoController;
 
Route::resource('photos', PhotoController::class)->only([
    'index', 'show'
]);
 
Route::resource('photos', PhotoController::class)->except([
    'create', 'store', 'update', 'destroy'
]);

API Resource Routes

apiResource 속성으로 create, edit을 제외한 CRUD 메서드를 만들 수 있다

use App\Http\Controllers\PhotoController;
 
Route::apiResource('photos', PhotoController::class);
use App\Http\Controllers\PhotoController;
use App\Http\Controllers\PostController;
 
Route::apiResources([
    'photos' => PhotoController::class,
    'posts' => PostController::class,
]);

Nested Resource

상위 하위 개념을 가지는 URI(Ex. User/post)는 아래와 같이 표현할 수 있다

use App\Http\Controllers\PhotoCommentController;
 
Route::resource('photos.comments', PhotoCommentController::class);

이는 URI로 변환하면 아래처럼 해석된다

/photos/{photo}/comments/{comment}

Naming Resource Routes

각 resource route에는 메서드 별로 네이밍이 가능하고

use App\Http\Controllers\PhotoController;
 
Route::resource('photos', PhotoController::class)->names([
    'create' => 'photos.build'
]);

파라미터를 지정하면 URI에 자동 매핑되어 받게 된다

use App\Http\Controllers\AdminUserController;
 
Route::resource('users', AdminUserController::class)->parameters([
    'users' => 'admin_user'
]);`

아래는 위와 같이 네이밍 했을 때 AdminUserController의 show 메서드를 호출하는 URI이다

/users/{admin_user}

Scoping Resource Routes

Nested Resource를 사용할 때 바인딩 하는 모델의 특정 컬럼을 바인딩하도록 지정할 수 있다

use App\Http\Controllers\PhotoCommentController;
 
Route::resource('photos.comments', PhotoCommentController::class)->scoped([
    'comment' => 'slug',
]);

이렇게 설정 시 아래와 같은 URI를 호출하게 된다

/photos/{photo}/comments/{comment:slug}

Singleton Resource Controllers

하나의 인스턴스만을 가지는 (Ex. 프로필) 리소스는 singleton 속성으로 정의할 수 있다

use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
 
Route::singleton('profile', ProfileController::class);

아래는 싱글톤 속성을 사용해 정의했을 때 매핑되는 URI이다

Nested resource도 사용 가능하다

Route::singleton('photos.thumbnail', ThumbnailController::class);

create, destroy, store 등의 속성도 정의하고 싶다면 creatable 메서드를 사용하자

Route::singleton('photos.thumbnail', ThumbnailController::class)->creatable();

Route::singleton(...)->destroyable();    // destroy 메서드만 추가

Dependency Injection & Controllers

Constructor Injection

<?php
 
namespace App\Http\Controllers;
 
use App\Repositories\UserRepository;
 
class UserController extends Controller
{
    /**
     * Create a new controller instance.
     */
    public function __construct(
        protected UserRepository $users,
    ) {}
}

컨트롤러가 생성될 때 의존성 주입이 가능하다

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
 
class UserController extends Controller
{
    /**
     * Store a new user.
     */
    public function store(Request $request): RedirectResponse
    {
        $name = $request->name;
 
        // Store the user...
 
        return redirect('/users');
    }
}

추가적으로 메서드에 대한 종속성을 타입 힌트로 지정할 수 있다.

profile
제어할 수 없는 것에 의지하지 말자

5개의 댓글

comment-user-thumbnail
2024년 7월 18일

Continuously improving knowledge with each lesson you share. It is great to approach the programs with the variety of learning coreball methods. How exciting it is to be able to access different in-depth information.

답글 달기
comment-user-thumbnail
2024년 11월 15일

With continued innovation in AI, robotics, and materials, the future of sex dolls looks even more promising. As societal perceptions continue to evolve, these products will likely become an increasingly mainstream option for those seeking companionship, pleasure, or emotional support in new and innovative ways.

답글 달기
comment-user-thumbnail
2024년 11월 15일

With continued innovation in AI, robotics, and materials, the future of sex dolls looks even more promising. As societal perceptions continue to evolve, these products will likely become an increasingly mainstream option for those seeking companionship, pleasure, or emotional support in new and innovative ways.

답글 달기
comment-user-thumbnail
2024년 11월 15일

With continued innovation in AI, robotics, and materials, the future of sex dolls looks even more promising. As societal perceptions continue to evolve, these products will likely become an increasingly mainstream option for those seeking companionship, pleasure, or emotional support in new and innovative ways.

답글 달기
comment-user-thumbnail
2024년 11월 15일

With continued innovation in AI, robotics, and materials, the future of sex dolls looks even more promising. As societal perceptions continue to evolve, these products will likely become an increasingly mainstream option for those seeking companionship, pleasure, or emotional support in new and innovative ways.

답글 달기