라우팅 및 컨트롤러

hyHA·2023년 11월 27일
0
post-custom-banner

REST

API를 작성하기 위한 설계 스타일.
라라벨에서 RESTful은 아래와 같다

  • 조회 : GET /tasks/14
  • 수정 : GET /tasks/14/edit

  • HTTP 메서드에 해당하는 응답을 위한 라우트 등록
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
  • 여러개의 HTTP 메서드에 응답하는 라우트를 등록
    • match 메서드, any 메서드
Route::match(['get', 'post'], '/', function () {
    //
});

Route::any('/', function () {
    //
});

tip : 동일한 URI를 공유하는 여러개의 라우트를 정의해야할 때에는 get, post, put, patch, delete, options 메서드를 any, match, redirect 메서드보다 먼저 정의해야합니다. 이렇게 해야 의도대로 올바른 라우트가 일치하는지 확인할 수 있습니다.

web.php 와 api.php

모든 라라벨의 라우트는 route 디렉토리 안에 들어 있는 라우트 파일에 정의되어 있습니다.
이 파일(web.php)은 애플리케이션의 App\Providers\RouteServiceProvider에 의해서 자동으로 로드됩니다.

  • 대부분의 애플리케이션에서 routes/web.php 파일에 라우트를 정의하여 시작한다
    • routes/web.php 에 정의된 라우트는 브라우저를 통해서 유입되는 라우트 URL을 정의하는데 사용됩니다.
    • routes/web.php 파일은 웹 인터페이스를 위한 라우트들을 정의합니다.
  • 이 라우트들에는 세션 상태CSRF 보호와 같은 기능을 제공하는 web 미들웨어 그룹이 할당되어 있습니다.
  • ex) 브라우저에서 http://example.com/user 와 같이 접속하기 위해서 다음의 라우트를 정의할 수 있습니다.
use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);

routes/api.php 안에 들어 있는 라우트들은 stateless 하고 api 미들웨어 그룹이 할당되어 있습니다.
routes/api.php 파일은 RouteServiceProvider의 라우트 그룹안에 중첩되어 정의되어 있습니다.
이 그룹을??에 의해서 /api URI가 자동으로 앞에 붙게 되므로, 이 파일에 정의한 모든 라우트에 일일이 적용하지 않아도 됩니다. RouteServiceProvider 파일의 라우트 그룹 옵션을 수정하면, 다른 prefix를 붙일 수도 있습니다.

라우트 정의

라라벨 애플리케이션에서

  • 브라우저를 통한 웹 접근용 라우트는 routes/web.php 파일에,
    • 일반 사용자가 방문하는 url
  • API용 라우트는 routes/api.php 파일에 정의한다.
    • api를 위한 url

클로저를 사용한 라우트 정의

'/'과 매칭되는 라우트를 정의해보자.
'/'에 접속하면 라우터는 정의된 클로저를 실행 후 결과 반환한다.
가장 기본적인 라라벨 라우트는 URI와 클로저로 정의할 수 있다.

Route::get('/', function(){
	return 'Hello, World';
}

[클로저와 라우터]

[클로저와 미들웨어]

  • 클로저
    • 익명 함수의 PHP버전.
    • 함수를 쓸거냐 컨트롤러써서 함수를 쓸거냐의 차이
    • 함수 안에 함수를 쓰는 것.
    • 함수를 실행시켜 값을 얻는 것.
    • 클로저는 객체로 전달하거나 변수에 할당하고, 다른 함수나 메서드에 파라미터로 전달하거나 직렬화할 수 있는 함수를 말한다
  • 미들웨어
    • 누구나 접속하게 할거냐 접속 제한을 할거냐의 차이
    • 애플리케이션 실행 전에 수행하고 싶은 것을 관리

주의!
위 예시는 문자열을 반환하지, 별도의 출력함수(echo)를 호출하지 않는다.

참고 : 요청/응답 라이프사이클

퍼사드 기능으로 라우트를 정의

  • 실제로 스태틱 메서드를 호출하는 것은 아니고 라라벨의 퍼사드 기능을 사용한 서비스의 위치를 식별하는 것 (11장에서 다룸)
    Route:: get('/', function() {
    	return view('welcome');
    }

튜플 문법 형태로 라우트를 정의

클로저는 사용이 쉽고 간편하지만 애플리케이션 규모가 커질수록 한 파일에서 모든 라우트를 정의하기 어렵다. 따라서, 라우트는 클로저 대신 튜플 문법 형태의 컨트롤러와 메서드명을 전달하는 방식으로 정의하는 것이 좋다

튜플 문법>>
Route::get('/', [WelcomeController::class, 'index']);

위 예제는 사용자의 요청을 App\Http\Controller\WelcomeController 클래스의 index 메서드로 전달하는 코드다.
이 방법은 클로저를 등록한 것과 동일하게 파라미터를 처리한다.

  • 튜플 문법과 문자열 문법
    라라벨의 라우트를 정의할 때는 튜플 문법과 문자열 문법을 사용할 수 있다.
    • 튜플 문법 : [컨트롤러 클래스, '메서드 이름'] 형태
    • 문자열 문법 : 컨트롤러@메서드 형태
      • 버전에 따라 네임스페이스에 주의해야 -> 이 때문에 튜플 문법을 사용하는 것이 좋다

라우트 파라미터

라우트를 정의할 때 url의 세그먼트를 변수로 받고자 한다면 파라미터를 정의하고 클로저에 전달할 수 있다.

  1. id 파라미터를 통해 url의 세그먼트를 변수로 받는다
Route::get('users/{id}/friends', function($id) {
	//
});
  1. 파라미터를 옵션 값(받거나 받지 않을 수 있게)으로 정의할 수 있다. 파라미터 뒤에?를 붙인다. 이때는 파라미터에 대한 기본값을 지정해야 함
Route::get('users/{id?}', function($id = 'fallbackId') {
	//
});
  1. 정규 표현식을 사용해서 파라미터가 특정 조건을 만족하는 경우에만 해당 라우트가 매칭되도록 정의
Route::get('users/{id}', function($id) {
	//
}) -> where('id', '[0-9]+');

Route::get('users/{username}', function($username) {
	//
}) -> where('username', '[A-Za-z]+');
  • 라우트 파라미터와 클로저/컨트롤러 메서드 파라미터 이름의 관계

    아래처럼 라우트 파라미터({id})와 클로저 파라미터($id)는 일반적으로 동일한 이름을 사용한다.
    정답은 '그렇지 않다'이다. 일치해야 하는 것은 왼쪽에서 오른쪽으로 정의된 순서뿐이다.{commentId}는

Route::get('users/{id}/friends/{commentId}', function($id) {
	//
});
  • 라우트 파라미터 사용시 제약사항
    라우트 파라미터는 항상 "{}"(중괄호)로 싸여져 있고,
    (-) 문자를 포함하지 않은 알파벳 문자로 구성되어 있어야합니다.
    언더스코어 (_)는 라우트 파라미터 이름으로 사용가능합니다.
    라우트 파라미터는 순서에 따라서 라우트 콜백 / 컨트롤러에 주입됩니다. 라우트 콜백 / 컨트롤러 인자는 관계 없습니다.

이름을 지정한 라우트

라우트 그룹

서명된 라우트

컨트롤러

라우트 모델 바인딩

라우트 캐싱

폼 메서드 스푸핑

CSRF 보호

리다이렉트

요청 중단하기

커스텀 응답

CORS 처리

테스트

참고
https://laravel.kr/docs/8.x/routing#redirect-routes

profile
룰루랄라
post-custom-banner

0개의 댓글