Laravel 경로 마스터하기
게시 됨: 2022-12-12백엔드와 관련하여 개발자는 결국 경로를 만나게 됩니다. 서버가 수신하는 모든 요청은 요청을 컨트롤러 또는 작업에 매핑하는 라우팅 목록을 통해 컨트롤러로 리디렉션되기 때문에 경로는 백엔드의 백본으로 간주될 수 있습니다.
Laravel은 우리를 위해 많은 구현 세부 사항을 숨기고 새로운 개발자와 숙련된 개발자가 웹 애플리케이션을 개발하는 데 도움이 되는 많은 구문 설탕을 제공합니다.
Laravel에서 경로를 관리하는 방법을 자세히 살펴보겠습니다.
Laravel의 백엔드 라우팅 및 교차 사이트 스크립팅
서버에는 공용 경로와 개인 경로가 모두 존재합니다. 공용 경로는 귀하와 귀하의 사용자를 악의적인 공격자에게 취약하게 만들 수 있는 삽입 공격 유형인 XSS(교차 사이트 스크립팅)의 가능성으로 인해 우려의 원인이 될 수 있습니다.
문제는 사용자가 세션 토큰이 필요하지 않은 경로에서 세션 토큰이 필요한 경로로 리디렉션될 수 있으며 토큰 없이도 계속 액세스할 수 있다는 것입니다.
이 문제를 해결하는 가장 간단한 방법은 새 HTTP 헤더를 적용하여 경로에 "리퍼러"를 추가하여 이 시나리오를 완화하는 것입니다.
'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]
Laravel 기본 라우팅
Laravel에서 경로는 사용자가 원하는 컨트롤러에 적절한 요청을 라우팅할 수 있도록 합니다. 가장 기본적인 Laravel Route는 Uniform Asset Identifier(라우트 경로)와 함수 또는 클래스가 될 수 있는 클로저를 허용합니다.
Laravel에서 경로는 web.php 및 api.php 파일 내부에 생성됩니다. Laravel은 기본적으로 두 가지 경로를 제공합니다. 하나는 WEB용이고 다른 하나는 API용입니다.
이러한 경로는 route/ 폴더에 있지만 Providers/RouteServiceProvider.php 에 로드됩니다.
이 작업을 수행하는 대신 routeServiceProvider.php 내에서 경로를 직접 로드할 수 있으며, route/ 폴더를 모두 건너뛸 수 있습니다.
리디렉션
경로를 정의할 때 일반적으로 경로에 액세스하는 사용자를 리디렉션하려고 하며 그 이유는 매우 다양합니다. 더 이상 사용되지 않는 경로이고 백엔드 또는 서버를 변경했거나 2단계 인증(2FA)을 설치하려고 하기 때문일 수 있습니다.
라라벨은 이 작업을 쉽게 수행할 수 있는 방법을 제공합니다. 프레임워크의 단순성 덕분에 경로 파사드에서 경로 파사드에 경로 재지정 방법을 사용할 수 있습니다.
선택적으로 리디렉션에 대한 상태 코드를 세 번째 매개 변수로 제공할 수 있습니다. permanentRedirect
메서드는 항상 301 상태 코드를 반환한다는 점을 제외하면 redirect
메서드와 동일하게 작동합니다.
// Simple redirect Route::redirect("/class", "/myClass"); // Redirect with custom status Route::redirect("/home", "/office", 305); // Route redirect with 301 status code Route::permanentRedirect("/home", "office");
리다이렉트 경로 내에서 "destination" 및 "status" 키워드는 Laravel에 의해 예약된 매개변수로 사용하는 것이 금지되어 있습니다.
// Illegal to use Route::redirect("/home", "/office/{status}");
견해
보기는 . Laravel 애플리케이션의 프런트엔드를 렌더링하는 데 사용하는 blade.php 파일입니다. 블레이드 템플릿 엔진을 사용하며 Laravel만을 사용하여 전체 스택 애플리케이션을 빌드하는 기본 방법입니다.
경로가 보기를 반환하도록 하려면 경로 파사드에서 보기 메서드를 사용하면 됩니다. 경로 매개 변수, 보기 이름 및 보기에 전달할 값의 선택적 배열을 허용합니다.
// When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");
뷰가 해당 매개변수와 함께 선택적 배열을 전달하여 "Hello, {name}
"이라고 말하고 싶어한다고 가정해 보겠습니다. 다음 코드를 사용하여 이를 수행할 수 있습니다(보기에 누락된 매개변수가 필요한 경우 요청이 실패하고 오류가 발생함).
Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);
경로 목록
애플리케이션의 크기가 커지면 라우팅해야 하는 요청 수도 커집니다. 그리고 엄청난 양의 정보로 인해 큰 혼란이 올 수 있습니다.
여기서 artisan route:list command
도움이 될 수 있습니다. 애플리케이션, 해당 미들웨어 및 컨트롤러에 정의된 모든 경로에 대한 개요를 제공합니다.
php artisan route:list
미들웨어가 없는 모든 경로 목록이 표시됩니다. 이를 위해 -v
플래그를 사용해야 합니다.
php artisan route:list -v
경로에 특정 이름이 있는 도메인 기반 설계를 사용하는 경우 다음과 같이 이 명령의 필터링 기능을 사용할 수 있습니다.
php artisan route:list –path=api/account
그러면 api/account 로 시작하는 경로만 표시됩니다.
반면에 –except-vendor
또는 –only-vendor
옵션을 사용하여 Laravel에 타사 정의 경로를 제외하거나 포함하도록 지시할 수 있습니다.
경로 매개변수
경우에 따라 사용자 ID 또는 토큰과 같은 경로를 사용하여 URI의 세그먼트를 캡처해야 할 수도 있습니다. 항상 중괄호( {}
) 안에 포함되고 알파벳 문자로만 구성되어야 하는 경로 매개변수를 정의하여 이를 수행할 수 있습니다.
라우트에 콜백 내부에 의존성이 있는 경우 Laravel 서비스 컨테이너는 자동으로 이를 주입합니다:
use Illuminate\Http\Request; use Controllers/DashboardController; Route::post('/dashboard/{id}, function (Request $request, string $id) { return 'User:' . $id; } Route::get('/dashboard/{id}, DashboardController.php);
필수 매개변수
Laravel의 필수 매개변수는 호출할 때 건너뛸 수 없는 경로의 매개변수입니다. 그렇지 않으면 오류가 발생합니다.
Route::post("/gdpr/{userId}", GetGdprDataController.php");
이제 GetGdprDataController.php 내에서 $userId 매개변수에 직접 액세스할 수 있습니다.
public function __invoke(int $userId) { // Use the userId that we received… }
경로는 여러 매개변수를 사용할 수 있습니다. 나열된 순서에 따라 경로 콜백/컨트롤러에 주입됩니다.
// api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }
선택적 매개변수
전체 응용 프로그램에 영향을 주지 않고 매개 변수만 있고 다른 것은 없는 경우 경로에서 작업을 수행하려는 상황에서 선택적 매개 변수를 추가할 수 있습니다. 이러한 선택적 매개변수는 ?
그들에 추가:
Route::get('/user/{age?}', function (int $age = null) { if (!$age) Log::info("User doesn't have age set"); else Log::info("User's age is " . $age); } Route::get('/user/{name?}', function (int $name = "John Doe") { Log::info("User's name is " . $name); }
경로 와일드카드
라라벨은 선택적 또는 필수 매개변수의 모습을 필터링하는 방법을 제공합니다.
사용자 ID 문자열을 원한다고 가정해 보겠습니다. where
메서드를 사용하여 경로 수준에서 이와 같이 유효성을 검사할 수 있습니다.
where
메소드는 매개변수의 이름과 유효성 검사에 적용될 정규식 규칙을 허용합니다. 기본적으로 첫 번째 매개변수를 사용하지만 매개변수가 많은 경우 매개변수의 이름을 키로, 규칙을 값으로 배열을 전달하면 Laravel이 모든 매개변수를 구문 분석합니다.
Route::get('/user/{age}', function (int $age) { // }->where('age', '[0-9]+'); Route::get('/user/{age}', function (int $age) { // }->where('[0-9]+'); Route::get('/user/{age}/{name}', function (int $age, string $name) { // }->where(['age' => '[0-9]+', 'name' => '[az][Az]+');
한 단계 더 나아가 Route
파사드에서 pattern
메소드를 사용하여 애플리케이션의 모든 경로에 유효성 검사를 적용할 수 있습니다.
Route::pattern('id', '[0-9]+');
이렇게 하면 이 정규식을 사용하여 모든 id
매개변수의 유효성을 검사합니다. 그리고 일단 정의하면 해당 매개변수 이름을 사용하는 모든 경로에 자동으로 적용됩니다.
보시다시피 Laravel은 /
문자를 경로의 구분 기호로 사용하고 있습니다. 경로에서 사용하려면 where
정규식을 사용하여 자리 표시자의 일부가 되도록 명시적으로 허용해야 합니다.
Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');
유일한 단점은 마지막 경로 세그먼트에서만 지원된다는 것입니다.
명명된 경로
이름에서 알 수 있듯이 경로 이름을 지정할 수 있으므로 URL을 생성하거나 특정 경로로 리디렉션하는 것이 편리합니다.
명명된 경로를 만드는 방법
명명된 경로를 생성하는 간단한 방법은 Route
파사드에 연결된 name
메소드에 의해 제공됩니다. 각 경로의 이름은 고유해야 합니다.
Route::get('/', function () { })->name("homepage");
경로 그룹
경로 그룹을 사용하면 각각의 모든 경로에서 다시 정의할 필요 없이 많은 경로에서 미들웨어와 같은 경로 속성을 공유할 수 있습니다.
미들웨어
우리가 가진 모든 경로에 미들웨어를 할당하면 먼저 group
방법을 사용하여 그룹으로 결합할 수 있습니다. 한 가지 고려해야 할 사항은 미들웨어가 그룹에 적용된 순서대로 실행된다는 것입니다.
Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });
컨트롤러
그룹이 동일한 컨트롤러를 사용하는 경우 controller
메서드를 사용하여 해당 그룹 내의 모든 경로에 대한 공통 컨트롤러를 정의할 수 있습니다. 이제 경로가 호출할 메서드를 지정해야 합니다.
Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });
하위 도메인 라우팅
하위 도메인 이름은 웹 사이트 도메인 이름의 시작 부분에 추가되는 추가 정보입니다. 이를 통해 웹사이트는 온라인 상점, 블로그, 프레젠테이션 등과 같은 특정 기능에 대한 콘텐츠를 웹사이트의 나머지 부분과 분리하고 구성할 수 있습니다.
우리의 경로는 하위 도메인 라우팅을 처리하는 데 사용할 수 있습니다. 컨트롤러와 경로에서 사용하기 위해 도메인과 하위 도메인의 일부를 포착할 수 있습니다. Route
파사드의 domain
메소드를 사용하여 단일 도메인 아래에 경로를 그룹화할 수 있습니다.
Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });
접두사 및 이름 접두사
경로 그룹이 있을 때마다 하나씩 수정하는 대신 Route
파사드의 prefix
및 name
과 같은 라라벨이 제공하는 추가 유틸리티를 사용할 수 있습니다.
prefix
메서드는 그룹의 각 경로에 지정된 URI를 접두사로 사용하는 데 사용할 수 있으며 name
메서드는 각 경로 이름에 지정된 문자열을 접두사로 지정하는 데 사용할 수 있습니다.
이를 통해 식별하기 위해 각각의 모든 이름이나 접두사를 수정할 필요 없이 관리 경로와 같은 새로운 항목을 만들 수 있습니다.
Route::name('admin.")->group(function() { Route::prefix("admin")->group(function() { Route::get('/get')->name('get'); Route::put('/put')->name(put'); Route::post('/post')->name('post'); }); });
이제 이러한 경로의 URI는 admin/get
, admin/put
, admin/post
및 이름 admin.get
, admin.put
및 admin.post
입니다.
경로 캐싱
응용 프로그램을 프로덕션 서버에 배포할 때 훌륭한 Laravel 개발자는 Laravel의 경로 캐시를 활용할 것입니다.
경로 캐싱이란 무엇입니까?
경로 캐싱은 모든 애플리케이션 경로를 등록하는 데 걸리는 시간을 줄입니다.
php artisan route:cache
실행하면 Illuminate/Routing/RouteCollection
의 인스턴스가 생성되고 인코딩된 후 직렬화된 출력이 bootstrap/cache.routes.php
에 기록됩니다.
이제 다른 요청이 있으면 이 캐시 파일을 로드합니다. 따라서 우리의 애플리케이션은 더 이상 경로 파일의 항목을 Illuminate/Routing/ Illuminate/Routing/RouteCollection
Illuminate/Routing/Route
개체로 구문 분석하고 변환할 필요가 없습니다.
경로 캐싱을 사용하는 것이 중요한 이유
Laravel이 제공하는 경로 캐싱 기능을 사용하지 않으면 애플리케이션이 예상보다 느리게 실행될 위험이 있으며, 이는 결과적으로 판매, 사용자 유지 및 브랜드에 대한 신뢰를 감소시킬 수 있습니다.
프로젝트의 규모와 경로 수에 따라 간단한 경로 캐싱 명령을 실행하면 애플리케이션 속도를 130%에서 500%까지 높일 수 있습니다. 거의 노력하지 않고도 엄청난 이득을 얻을 수 있습니다.
요약
라우팅은 백엔드 개발의 중추입니다. 라라벨 프레임워크는 경로를 정의하고 관리하는 장황한 방법을 제공함으로써 이 점에서 뛰어납니다.
개발은 실제로 모든 사람이 액세스할 수 있으며 Laravel에서 빌드된 덕분에 애플리케이션 속도를 높이는 데 도움이 됩니다.
Laravel 경로와 관련하여 어떤 다른 트릭과 팁을 접하셨습니까? 의견 섹션에서 알려주십시오!