오늘부터 공부한다
1. 라라벨 공식문서 라우팅 정리 본문
1. 기본 라우팅
라라벨 라우터는 URI와 클로저를 허용하므로 복잡한 라우팅 구성 파일 없이도 간단하고 표현적인 방법을 제공합니다.
use Illuminate\Support\Facades\Route;
Route::get('/greeting', function () {
return 'Hello World';
});
a. 기본 경로 파일
모든 라우터의 경로는 App\Providers\RouteServiceProvider에 의해 자동으로 로드 되며
routes\web.php 파일은 웹 인터페이스용 경로를 정의합니다.
이러한 경로에는 웹 미들웨어 그룹이 할당되어 세션 상태 및 CSRF 보호와 같은 기능을 제공합니다.
routes/web.php에 정의된 경로는 브라우저에서 정의된 라우트의 URL을 입력하여 액세스할 수 있습니다.
b. 사용 가능한 라우터
라우터는 기본적으로 모든 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를 사용하여 모든 HTTP 동사에 응답하는 경로를 등록할 수도 있습니다 .
Route::match(['get', 'post'], '/', function () {
//
});
Route::any('/', function () {
//
});
동일한 URI를 공유하는 여러 경로를 정의할 때 get, post, put, patch, delete및 메서드를 사용하는 경로를 options을 사용하는 경로보다 먼저 정의해야 합니다 . 이렇게 하면 들어오는 요청이 올바른 경로와 일치하는지 확인할 수 있습니다.
c. 의존성 주입
경로의 콜백에서 경로에 필요한 종속성을 입력할 수 있습니다.
선언된 종속성은 Laravel 서비스 컨테이너 에 의해 자동으로 해결되고 콜백에 주입됩니다.
use Illuminate\Http\Request;
Route::get('/users', function (Request $request) {
// ...
});
d. CSRF 보호
POST, PUT, PATCH가 들어가는 html 양식에서 CSRF 토큰 필드가 포함되지 않으면 요청이 거부됩니다.
<form method="POST" action="/profile">
@csrf
...
</form>
2. 경로 재지정
다른 URI로 리디렉션되는 경로를 정의하는 경우 Route::redirect를 사용할 수 있습니다.
이 방법은 간단한 리디렉션을 수행하기 위해 전체 경로나 컨트롤러를 정의할 필요가 없도록 편리한 바로 가기를 제공합니다.
Route::redirect('/here', '/there');
기본적으로 상태 코드를 반환합니다.
선택적으로 세 번째 매개변수를 사용하여 상태 코드를 정의할 수 있습니다.
Route::redirect('/here', '/there', 301);
또는 Route::permanentRedirect 메서드를 사용하여 상태 코드를 반환할 수 있습니다.
Route::permanentRedirect('/here', '/there');
3. 경로 보기
경로를 반환해야 하는 경우 Route::view메서드를 사용할 수 있습니다 .
이 view메서드는 URI를 첫 번째 인수로 받아들이고 보기 이름을 두 번째 인수로 받아들입니다.
또한 선택적 세 번째 인수로 뷰에 전달할 데이터 배열을 제공할 수 있습니다.
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
4. 경로 매개변수
a. 필수 매개변수
때로는 경로 내에서 URI의 세그먼트를 가져와야 합니다.
Route::get('/user/{id}', function ($id) {
return 'User '.$id;
});
경로에 필요한 만큼 경로 매개변수를 정의할 수 있습니다.
Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
경로 매개변수는 항상 {}중괄호로 묶여 있으며 알파벳 문자로 구성되어야 합니다.
밑줄(_)은 경로 매개변수 이름에서도 사용할 수 있습니다.
경로 매개변수는 순서에 따라 경로 콜백/컨트롤러에 주입됩니다.
경로 콜백/컨트롤러 인수의 이름은 중요하지 않습니다.
b. 매개변수 및 종속성 주입
라우트에 Laravel 서비스 컨테이너가 라우트의 콜백에 자동으로 삽입하기를 원하는 종속성이 있는 경우 종속성 다음에 라우트 매개변수를 나열해야 합니다.
use Illuminate\Http\Request;
Route::get('/user/{id}', function (Request $request, $id) {
return 'User '.$id;
});
5. 선택적 매개변수
경우에 따라 URI에 항상 존재하지 않을 수 있는 경로 매개변수를 지정해야 할 수도 있습니다. ?매개변수 이름 뒤에 표시를 하면 됩니다 . 경로의 해당 변수에 기본값을 지정해야 합니다.
Route::get('/user/{name?}', function ($name = null) {
return $name;
});
Route::get('/user/{name?}', function ($name = 'John') {
return $name;
});
6. 정규식 제약 조건
where 라우터 인스턴스의 메소드를 사용하여 라우트 매개변수의 형식을 제한할 수 있습니다.
where메서드는 매개변수의 이름과 매개변수를 제한하는 방법을 정의하는 정규식을 허용합니다.
Route::get('/user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('/user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('/user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
편의를 위해 일반적으로 사용되는 일부 정규식 패턴에는 경로에 패턴 제약 조건을 빠르게 추가할 수 있는 도우미 메서드가 있습니다.
Route::get('/user/{id}/{name}', function ($id, $name) {
//
})->whereNumber('id')->whereAlpha('name');
Route::get('/user/{name}', function ($name) {
//
})->whereAlphaNumeric('name');
Route::get('/user/{id}', function ($id) {
//
})->whereUuid('id');
들어오는 요청이 경로 패턴 제약 조건과 일치하지 않으면 404 HTTP 응답이 반환됩니다.
a. 전역 제약 조건
경로 매개변수가 항상 주어진 정규 표현식에 의해 제한되도록 하려면
pattern방법을 사용할 수 있습니다.
App\Providers\RouteServiceProvider
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
}
패턴이 정의되면 해당 매개변수 이름을 사용하는 모든 경로에 자동으로 적용됩니다.
Route::get('/user/{id}', function ($id) {
// Only executed if {id} is numeric...
});
b. 인코딩된 슬래시
라라벨 라우팅 컴포넌트는 /라우트 매개변수 값 내에 존재하는 것을 제외한 모든 문자를 허용합니다.
조건 정규식 /을 사용하여 자리 표시자의 일부가 되도록 명시적으로 허용해야 합니다.
Route::get('/search/{search}', function ($search) {
return $search;
})->where('search', '.*');
7. 명명된 경로
명명된 경로를 사용하면 특정 경로에 대한 URL 또는 리디렉션을 편리하게 생성할 수 있습니다.
name라우트 정의에 메소드를 연결하여 라우트의 이름을 지정할 수 있습니다.
경로 이름은 항상 고유적이어야 합니다.
Route::get('/user/profile', function () {
//
})->name('profile');
컨트롤러 작업에 대한 경로 이름을 지정할 수도 있습니다.
Route::get(
'/user/profile',
[UserProfileController::class, 'show']
)->name('profile');
a. 명명된 경로에 대한 URL 생성
주어진 라우트에 이름을 할당하고 나면 URL을 생성하거나 Laravel route및 redirect도우미 기능을 통해
리디렉션할 때 해당 라우트의 이름을 사용할 수 있습니다.
// Generating URLs...
$url = route('profile');
// Generating Redirects...
return redirect()->route('profile');
명명된 경로가 매개변수를 정의하는 경우 매개변수를 함수의 두 번째 인수로 전달할 수 있습니다.
주어진 매개변수는 생성된 URL의 올바른 위치에 자동으로 삽입됩니다.
Route::get('/user/{id}/profile', function ($id) {
//
})->name('profile');
$url = route('profile', ['id' => 1]);
배열에 추가 매개변수를 전달하면 해당 키/값 쌍이 자동으로 생성된 URL의 쿼리 문자열에 추가됩니다.
Route::get('/user/{id}/profile', function ($id) {
//
})->name('profile');
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
// /user/1/profile?photos=yes