개발 알다가도 모르겠네요

Laravel Controller 본문

웹/Laravel

Laravel Controller

이재빵 2023. 3. 15. 10:08
728x90

리퀘스트 처리에 관한 논리는 라우트 파일에서 클로저로 정의 할 수 있지만, "컨트롤러" 클래스를 사용하여 같은 동작을 설정할 수 있다.

기본적으로 컨트롤러 클래스 파일은 app/Http/Controllers 디렉토리에 저장된다.

 

기본 Controller

컨트롤러는 Laravel에 포함된 기본 컨트롤러 클래스를 확장한다. 기본 컨트롤러 클래스는 App\Http\Controllers\Controller 경로에 위치한다.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;

class UserController extends Controller
{
    /**
     * Show the profile for a given user.
     *
     * @param  int  $id
     * @return \Illuminate\View\View
     */
    public function show($id)
    {
        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 메소드가 호출되고 라우트의 파라미터가 show 메소드에 전달된다.

 

컨트롤러는 기본 컨트롤러 클래스를 필수로 상속 받지 않아도 작동하지만, 기본 컨트롤러 클래스를 상속하지 않는다면

middleware  authorize 메서드와 같은 편리한 기능을 사용하기 위한 접근을 할 수 없다.

 

Controller Middleware

미들웨어는 다음과 같이 컨트롤러 라우트에 지정할 수 있다.

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

 

또는 컨트롤러의 생성자 내에서 middleware 메서드를 사용하여 컨트롤러의 엑션에 미들웨어를 할당할 수 있다.

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

 

 

의존성 주입 & 컨트롤러

 

생성자 주입

라라벨의 서비스 컨테이너는 모든 라라벨 컨트롤러의 의존성을 해결하기 위해서 사용된다. 그 결과 컨트롤러가 필요로 하는 의존 객체들에 대해서 생성자에서 타입힌트로 지정할 수 있게 되고, 의존성은 자동으로 해결되어 컨트롤러 인스턴스에 주입된다.

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
    /**
     * The user repository instance.
     */
    protected $users;

    /**
     * Create a new controller instance.
     *
     * @param  \App\Repositories\UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }
}

 

메소드 인젝션

생성자 주입 외에도 컨트롤러의 메소드에 대한 유형 힌트 종속성을 사용할 수도 있다. 메소드 주입의 일반적인 사용 사례는 Illuminate\Http\Request 인스턴스를 컨트롤러 메소드에 주입하는 것이다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Store a new user.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $name = $request->name;

        //
    }
}

 

컨트롤러의 메소드가 라우트 파라메터의 전달도 고려해야 하는 경우, 의존성 주입 파라메터 다음에 라우터 파라메터를 나열한다.

예를 들어 경로가 다음과 같이 정의된 경우

use App\Http\Controllers\UserController;

Route::put('/user/{id}', [UserController::class, 'update']);

 

다음과 같은 코드를 통해 동일하게 타입힌트로 지정된 Illuminate\Http\Request 의존성 주입 대상과 컨트롤러 메소드에 정의된 id 파라메터에 접근할 수 있다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Update the given user.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  string  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}