API를 작성하기 위한 설계 스타일.
라라벨에서 RESTful은 아래와 같다
GET /tasks/14
GET /tasks/14/edit
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
match
메서드, any
메서드Route::match(['get', 'post'], '/', function () {
//
});
Route::any('/', function () {
//
});
tip : 동일한 URI를 공유하는 여러개의 라우트를 정의해야할 때에는 get, post, put, patch, delete, options 메서드를 any, match, redirect 메서드보다 먼저 정의해야합니다. 이렇게 해야 의도대로 올바른 라우트가 일치하는지 확인할 수 있습니다.
모든 라라벨의 라우트는 route 디렉토리 안에 들어 있는 라우트 파일에 정의되어 있습니다.
이 파일(web.php)은 애플리케이션의 App\Providers\RouteServiceProvider
에 의해서 자동으로 로드됩니다.
routes/web.php
파일에 라우트를 정의하여 시작한다routes/web.php
에 정의된 라우트는 브라우저를 통해서 유입되는 라우트 URL을 정의하는데 사용됩니다. routes/web.php
파일은 웹 인터페이스를 위한 라우트들을 정의합니다.세션 상태
와 CSRF 보호
와 같은 기능을 제공하는 web 미들웨어 그룹
이 할당되어 있습니다. 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 파일에,API용 라우트
는 routes/api.php 파일에 정의한다. '/'과 매칭되는 라우트를 정의해보자.
'/'에 접속하면 라우터는 정의된 클로저를 실행 후 결과 반환한다.
가장 기본적인 라라벨 라우트는 URI와 클로저로 정의할 수 있다.
Route::get('/', function(){
return 'Hello, World';
}
[클로저와 라우터]
[클로저와 미들웨어]
- 클로저
- 익명 함수의 PHP버전.
- 함수를 쓸거냐 컨트롤러써서 함수를 쓸거냐의 차이
- 함수 안에 함수를 쓰는 것.
- 함수를 실행시켜 값을 얻는 것.
- 클로저는 객체로 전달하거나 변수에 할당하고, 다른 함수나 메서드에 파라미터로 전달하거나 직렬화할 수 있는 함수를 말한다
- 미들웨어
- 누구나 접속하게 할거냐 접속 제한을 할거냐의 차이
- 애플리케이션 실행 전에 수행하고 싶은 것을 관리
주의!
위 예시는 문자열을 반환하지, 별도의 출력함수(echo)를 호출하지 않는다.
Route:: get('/', function() {
return view('welcome');
}
클로저는 사용이 쉽고 간편하지만 애플리케이션 규모가 커질수록 한 파일에서 모든 라우트를 정의하기 어렵다. 따라서, 라우트는 클로저
대신 튜플 문법 형태의 컨트롤러와 메서드명
을 전달하는 방식으로 정의하는 것이 좋다
튜플 문법>>
Route::get('/', [WelcomeController::class, 'index']);
위 예제는 사용자의 요청을 App\Http\Controller\WelcomeController 클래스의 index 메서드로 전달하는 코드다.
이 방법은 클로저를 등록한 것과 동일하게 파라미터를 처리한다.
라우트를 정의할 때 url의 세그먼트
를 변수로 받고자 한다면 파라미터
를 정의하고 클로저에 전달할 수 있다.
Route::get('users/{id}/friends', function($id) {
//
});
Route::get('users/{id?}', function($id = 'fallbackId') {
//
});
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) { // });
- 라우트 파라미터 사용시 제약사항
라우트 파라미터는 항상 "{}"(중괄호)로 싸여져 있고,
(-) 문자를 포함하지 않은 알파벳 문자로 구성되어 있어야합니다.
언더스코어 (_)는 라우트 파라미터 이름으로 사용가능합니다.
라우트 파라미터는 순서에 따라서 라우트 콜백 / 컨트롤러에 주입됩니다. 라우트 콜백 / 컨트롤러 인자는 관계 없습니다.