라우팅
기본 라우팅 규칙
webman의 기본 라우팅 규칙은 http://127.0.0.1:8787/{컨트롤러}/{액션}
입니다.
기본 컨트롤러는 app\controller\IndexController
이며, 기본 액션은 index
입니다.
예를 들어:
http://127.0.0.1:8787
는 기본적으로app\controller\IndexController
클래스의index
메서드에 접근합니다.http://127.0.0.1:8787/foo
는 기본적으로app\controller\FooController
클래스의index
메서드에 접근합니다.http://127.0.0.1:8787/foo/test
는 기본적으로app\controller\FooController
클래스의test
메서드에 접근합니다.http://127.0.0.1:8787/admin/foo/test
는 기본적으로app\admin\controller\FooController
클래스의test
메서드에 접근합니다. (참고: 다중 애플리케이션)
더불어 webman은 1.4부터 더 복잡한 기본 라우팅을 지원합니다. 예를 들어:
app
├── admin
│ └── v1
│ └── v2
│ └── v3
│ └── controller
│ └── IndexController.php
└── controller
├── v1
│ └── IndexController.php
└── v2
└── v3
└── IndexController.php
특정 요청의 라우트를 변경하려면 구성 파일 config/route.php
를 수정하십시오.
기본 라우팅을 비활성화하려면 구성 파일 config/route.php
의 마지막 줄에 다음 구성을 추가하십시오:
Route::disableDefaultRoute();
클로저 라우팅
config/route.php
에 다음과 같은 라우팅 코드를 추가하십시오.
use support\Request;
Route::any('/test', function (Request $request) {
return response('test');
});
주의
클로저 함수는 어떤 컨트롤러에도 속하지 않기 때문에$request->app
,$request->controller
,$request->action
모두 빈 문자열입니다.
주소 http://127.0.0.1:8787/test
에 접근하면 test
문자열이 반환됩니다.
주의
라우트 경로는 반드시/
로 시작해야 합니다. 예를 들어
use support\Request;
// 잘못된 사용
Route::any('test', function (Request $request) {
return response('test');
});
// 올바른 사용
Route::any('/test', function (Request $request) {
return response('test');
});
클래스 라우팅
config/route.php
에 다음 라우팅 코드를 추가하십시오.
Route::any('/testclass', [app\controller\IndexController::class, 'test']);
주소 http://127.0.0.1:8787/testclass
에 접근하면 app\controller\IndexController
클래스의 test
메서드의 반환값이 반환됩니다.
라우팅 파라미터
라우트에 파라미터가 포함된 경우 {key}
를 사용하여 일치시키며, 일치 결과가 대응하는 컨트롤러 메서드 파라미터로 전달됩니다(두 번째 파라미터부터 순차적으로 전달됨). 예를 들어:
// /user/123 및 /user/abc와 일치
Route::any('/user/{id}', [app\controller\UserController::class, 'get']);
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request, $id)
{
return response('접수된 파라미터'.$id);
}
}
더 많은 예시:
use support\Request;
// /user/123과 일치, /user/abc와는 일치하지 않음
Route::any('/user/{id:\d+}', function (Request $request, $id) {
return response($id);
});
// /user/foobar와 일치, /user/foo/bar와는 일치하지 않음
Route::any('/user/{name}', function (Request $request, $name) {
return response($name);
});
// /user, /user/123 및 /user/abc와 일치. []는 선택적임
Route::any('/user[/{name}]', function (Request $request, $name = null) {
return response($name ?? 'tom');
});
// /user/로 시작하는 모든 요청과 일치
Route::any('/user/[{path:.+}]', function (Request $request) {
return $request->path();
});
// 모든 options 요청과 일치. : 뒤에 정규 표현식을 작성하여 해당 명명 파라미터의 정규 규칙을 나타냄
Route::options('[{path:.+}]', function () {
return response('');
});
고급 사용법 요약
[]
문법은 Webman 라우팅에서 주로 선택적 경로 부분을 처리하거나 동적 라우팅을 일치시키는 데 사용되며, 라우트에 더 복잡한 경로 구조와 일치 규칙을 정의할 수 있게 합니다.
: 정규 표현식을 지정하는 데 사용됩니다.
라우팅 그룹
때때로 라우트에 동일한 접두사가 많이 포함되는 경우, 라우팅 그룹을 사용하여 정의를 간소화할 수 있습니다. 예를 들어:
Route::group('/blog', function () {
Route::any('/create', function (Request $request) {return response('create');});
Route::any('/edit', function (Request $request) {return response('edit');});
Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
});
이는 다음과 같습니다.
Route::any('/blog/create', function (Request $request) {return response('create');});
Route::any('/blog/edit', function (Request $request) {return response('edit');});
Route::any('/blog/view/{id}', function (Request $request, $id) {return response("view $id");});
group 중첩 사용
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function (Request $request) {return response('create');});
Route::any('/edit', function (Request $request) {return response('edit');});
Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
});
});
라우팅 미들웨어
특정 하나의 라우트 또는 라우트 그룹에 미들웨어를 설정할 수 있습니다.
예를 들어:
Route::any('/admin', [app\admin\controller\IndexController::class, 'index'])->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
Route::group('/blog', function () {
Route::any('/create', function () {return response('create');});
Route::any('/edit', function () {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {response("view $id");});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
# 잘못된 사용 예 (webman-framework >= 1.5.7 시 이 사용법이 유효함)
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function (Request $request) {return response('create');});
Route::any('/edit', function (Request $request) {return response('edit');});
Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
# 올바른 사용 예
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function (Request $request) {return response('create');});
Route::any('/edit', function (Request $request) {return response('edit');});
Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
});
리소스형 라우팅
Route::resource('/test', app\controller\IndexController::class);
//지정 리소스 라우팅
Route::resource('/test', app\controller\IndexController::class, ['index','create']);
//비정의성 리소스 라우팅
// 예를 들어 notify 접근 주소는 any형 라우트 /test/notify 또는 /test/notify/{id} 모두 가능하며 routeName은 test.notify로 설정됨
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
동사 | URI | 액션 | 라우트 이름 |
---|---|---|---|
GET | /test | index | test.index |
GET | /test/create | create | test.create |
POST | /test | store | test.store |
GET | /test/{id} | show | test.show |
GET | /test/{id}/edit | edit | test.edit |
PUT | /test/{id} | update | test.update |
DELETE | /test/{id} | destroy | test.destroy |
PUT | /test/{id}/recovery | recovery | test.recovery |
URL 생성
주의
현재 중첩된 그룹 라우트를 기반으로 URL을 생성하는 것은 지원되지 않습니다.
예를 들어 라우트:
Route::any('/blog/{id}', [app\controller\BlogController::class, 'view'])->name('blog.view');
이 라우트의 URL을 생성하기 위해 다음 방법을 사용할 수 있습니다.
route('blog.view', ['id' => 100]); // 결과는 /blog/100
뷰에서 라우트의 URL을 사용할 때 이 방법을 사용하면 라우트 규칙이 어떻게 변하든 간에 URL이 자동으로 생성되어 라우트 주소 조정으로 인해 많은 뷰 파일을 수정해야 하는 상황을 피할 수 있습니다.
라우트 정보 가져오기
$request->route
객체를 통해 현재 요청 라우트 정보를 가져올 수 있습니다. 예를 들어
$route = $request->route; // $route = request()->route와 동일
if ($route) {
var_export($route->getPath());
var_export($route->getMethods());
var_export($route->getName());
var_export($route->getMiddleware());
var_export($route->getCallback());
var_export($route->param());
}
주의
현재 요청이config/route.php
에서 구성된 어떤 라우트와도 일치하지 않을 경우,$request->route
는 null이 됩니다. 즉, 기본 라우트를 사용할 때$request->route
는 null이 됩니다.
404 처리
라우트를 찾을 수 없을 때 기본적으로 404 상태 코드를 반환하고 404 관련 내용을 출력합니다.
개발자가 라우트를 찾을 수 없을 때 비즈니스 프로세스에 개입하고 싶다면 webman에서 제공하는 회귀 라우트 Route::fallback($callback)
메서드를 사용할 수 있습니다. 예를 들어 아래의 코드 로직은 라우트를 찾을 수 없을 때 홈페이지로 리디렉션합니다.
Route::fallback(function(){
return redirect('/');
});
또한 라우트가 없을 때 JSON 데이터를 반환할 수 있습니다. 이는 webman이 API 인터페이스로 사용할 때 매우 유용합니다.
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 not found']);
});
404에 미들웨어 추가
기본 404 요청은 어떤 미들웨어도 통과하지 않습니다. 404 요청에 미들웨어를 추가하려면 다음 코드를 참고하십시오.
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 not found']);
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
관련 링크 사용자 정의 404 500 페이지
기본 라우트 비활성화
// 기본 프로젝트의 기본 라우트를 비활성화합니다. 애플리케이션 플러그인에는 영향을 미치지 않습니다.
Route::disableDefaultRoute();
// 기본 프로젝트의 admin 애플리케이션의 라우트를 비활성화합니다. 애플리케이션 플러그인에는 영향을 미치지 않습니다.
Route::disableDefaultRoute('', 'admin');
// foo 플러그인의 기본 라우트를 비활성화합니다. 기본 프로젝트에는 영향을 미치지 않습니다.
Route::disableDefaultRoute('foo');
// foo 플러그인의 admin 애플리케이션의 기본 라우트를 비활성화합니다. 기본 프로젝트에는 영향을 미치지 않습니다.
Route::disableDefaultRoute('foo', 'admin');
// 컨트롤러 [\app\controller\IndexController::class, 'index']의 기본 라우트를 비활성화합니다.
Route::disableDefaultRoute([\app\controller\IndexController::class, 'index']);
주석을 통한 기본 라우트 비활성화
주석을 통해 특정 컨트롤러의 기본 라우트를 비활성화할 수 있습니다. 예를 들어:
namespace app\controller;
use support\annotation\DisableDefaultRoute;
#[DisableDefaultRoute]
class IndexController
{
public function index()
{
return 'index';
}
}
동일하게, 주석을 통해 특정 컨트롤러의 기본 라우트를 비활성화할 수 있습니다. 예를 들어:
namespace app\controller;
use support\annotation\DisableDefaultRoute;
class IndexController
{
#[DisableDefaultRoute]
public function index()
{
return 'index';
}
}
라우트 인터페이스
// $uri의 임의의 메서드 요청에 대한 라우트를 설정
Route::any($uri, $callback);
// $uri의 get 요청에 대한 라우트를 설정
Route::get($uri, $callback);
// $uri의 post 요청에 대한 라우트를 설정
Route::post($uri, $callback);
// $uri의 put 요청에 대한 라우트를 설정
Route::put($uri, $callback);
// $uri의 patch 요청에 대한 라우트를 설정
Route::patch($uri, $callback);
// $uri의 delete 요청에 대한 라우트를 설정
Route::delete($uri, $callback);
// $uri의 head 요청에 대한 라우트를 설정
Route::head($uri, $callback);
// $uri의 options 요청에 대한 라우트를 설정
Route::options($uri, $callback);
// 여러 요청 유형에 대한 라우트를 동시에 설정
Route::add(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $uri, $callback);
// 그룹 라우트
Route::group($path, $callback);
// 리소스 라우트
Route::resource($path, $callback, [$options]);
// 라우트 비활성화
Route::disableDefaultRoute($plugin = '');
// 회귀 라우트, 기본 라우트를 설정
Route::fallback($callback, $plugin = '');
// 모든 라우트 정보 가져오기
Route::getRoutes();
만약 uri가 해당 라우트에 매칭되지 않고(기본 라우트를 포함하여) 회귀 라우트도 설정되어 있지 않으면 404가 반환됩니다.
여러 라우트 구성 파일
여러 라우트 구성 파일을 사용하여 라우트를 관리하고 싶다면, 예를 들어 다중 애플리케이션에서 각 애플리케이션에 자체 라우트 구성이 있는 경우 require
외부 파일의 방법으로 외부 라우트 구성 파일을 로드할 수 있습니다.
예를 들어 config/route.php
에서
<?php
// admin 애플리케이션의 라우트 구성 로드
require_once app_path('admin/config/route.php');
// api 애플리케이션의 라우트 구성 로드
require_once app_path('api/config/route.php');