백엔드 개발 PHP 튜토리얼 PHP 라우팅 라이브러리 FastRoute 사용에 대한 튜토리얼

PHP 라우팅 라이브러리 FastRoute 사용에 대한 튜토리얼

Apr 30, 2020 am 10:00 AM
php

GitHub: https://github.com/nikic/FastRoute

这个库提供了基于正则表达式的快速路由实现。这篇文章解释了 FastRoute 是如何工作的和它为什么很快。

安装

通过 composer 安装

composer require nikic/fast-route

要求 PHP 5.4 及更高的版本

使用

这是一个基本的使用示例

<?php
require &#39;/path/to/vendor/autoload.php&#39;;
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute(&#39;GET&#39;, &#39;/users&#39;, &#39;get_all_users_handler&#39;);
    // {id} 必须是一个数字 (\d+)
    $r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}&#39;, &#39;get_user_handler&#39;);
    //  /{title} 后缀是可选的
    $r->addRoute(&#39;GET&#39;, &#39;/articles/{id:\d+}[/{title}]&#39;, &#39;get_article_handler&#39;);
});
// 获取请求的方法和 URI
$httpMethod = $_SERVER[&#39;REQUEST_METHOD&#39;];
$uri = $_SERVER[&#39;REQUEST_URI&#39;];
// 去除查询字符串( ? 后面的内容) 和 解码 URI
if (false !== $pos = strpos($uri, &#39;?&#39;)) {
    $uri = substr($uri, 0, $pos);
}
$uri = rawurldecode($uri);
$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::NOT_FOUND:
        // ... 404 Not Found 没找到对应的方法
        break;
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        $allowedMethods = $routeInfo[1];
        // ... 405 Method Not Allowed  方法不允许
        break;
    case FastRoute\Dispatcher::FOUND: // 找到对应的方法
        $handler = $routeInfo[1]; // 获得处理函数
        $vars = $routeInfo[2]; // 获取请求参数
        // ... call $handler with $vars // 调用处理函数
        break;
}
로그인 후 복사

定义路由

通过调用 FastRoute\simpleDispatcher() 函数来定义路由,该函数接受一个以 FastRoute\RouteCollector 实例为参数的闭包作为参数。通过在 collector 实例里面调用 addRoute() 增加路由。

$r->addRoute($method, $routePattern, $handler);
로그인 후 복사

$method 是大写的 HTTP 方法,能够被某个路由匹配,可以使用数组指定多个有效的 $method

// 这里两行调用
$r->addRoute(&#39;GET&#39;, &#39;/test&#39;, &#39;handler&#39;);
$r->addRoute(&#39;POST&#39;, &#39;/test&#39;, &#39;handler&#39;);
// 等同于这一行调用
$r->addRoute([&#39;GET&#39;, &#39;POST&#39;], &#39;/test&#39;, &#39;handler&#39;);
로그인 후 복사

默认情况下 $routePattern 使用一种语法,比如 {foo} 是指定名称为 foo 的占位符,可以匹配正则表达式 [^/]+. 。要调整占位符匹配的模式,可以通过编写 {bar:[0-9] +} 来指定自定义模式。一些例子

// 匹配 /user/42,不匹配 /user/xyx
$r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}&#39;, &#39;handler&#39;);
// 匹配 /user/foobar,不匹配 /user/foo/bar
$r->addRoute(&#39;GET&#39;, &#39;/user/{name}&#39;, &#39;handler&#39;);
// 匹配 /user/foobar,也匹配 /user/foo/bar
$r->addRoute(&#39;GET&#39;, &#39;/user/{name:.+}&#39;, &#39;handler&#39;);
로그인 후 복사

路由占位符的自定义模式不能使用捕获组,例如 {lang:(en|de)} 不是有效的占位符,因为 () 是一个捕获组,可以使用 {lang:en|de} 或者 {lang:(?:en|de)} 代替。

另外,在路由 [...] 中定义的部分是可选匹配的,所以 /foo[bar] 将匹配 /foo 和 /foobar 。路由可选部分只支持在定义的末尾,而不能在定义的中间。

// 这个路由有,[/{name}] 可选择匹配部分
$r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}[/{name}]&#39;, &#39;handler&#39;);
// 等同于这两个路由
$r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}&#39;, &#39;handler&#39;);
$r->addRoute(&#39;GET&#39;, &#39;/user/{id:\d+}/{name}&#39;, &#39;handler&#39;);
// 多层嵌套可选路由,也是支持的
$r->addRoute(&#39;GET&#39;, &#39;/user[/{id:\d+}[/{name}]]&#39;, &#39;handler&#39;);
// 这个路由定义无效,因为可选部分只能在定义的末尾
$r->addRoute(&#39;GET&#39;, &#39;/user[/{id:\d+}]/{name}&#39;, &#39;handler&#39;);
로그인 후 복사

$handler 参数不一定必须是回调函数,它也可以是控制器类名或任何其他类型的数据。FastRoute 只告诉你哪个 handler 对应 URI,如何解释它取决于你。

请求方法的书写快捷方式

对于 GETPOSTPUTPATCHDELETE HEAD 请求方法,可使用快捷方式。

$r->get(&#39;/get-route&#39;, &#39;get_handler&#39;);
$r->post(&#39;/post-route&#39;, &#39;post_handler&#39;);
// 等同于
$r->addRoute(&#39;GET&#39;, &#39;/get-route&#39;, &#39;get_handler&#39;);
$r->addRoute(&#39;POST&#39;, &#39;/post-route&#39;, &#39;post_handler&#39;);
로그인 후 복사

路由组

你可以在一个组内定义路由,同一组内的路由有相同的前缀。

$r->addGroup(&#39;/admin&#39;, function (RouteCollector $r) {
    $r->addRoute(&#39;GET&#39;, &#39;/do-something&#39;, &#39;handler&#39;);
    $r->addRoute(&#39;GET&#39;, &#39;/do-another-thing&#39;, &#39;handler&#39;);
    $r->addRoute(&#39;GET&#39;, &#39;/do-something-else&#39;, &#39;handler&#39;);
});
// 等同于
$r->addRoute(&#39;GET&#39;, &#39;/admin/do-something&#39;, &#39;handler&#39;);
$r->addRoute(&#39;GET&#39;, &#39;/admin/do-another-thing&#39;, &#39;handler&#39;);
$r->addRoute(&#39;GET&#39;, &#39;/admin/do-something-else&#39;, &#39;handler&#39;);
로그인 후 복사

可以定义多层嵌套组结构。

缓存

使用 simpleDispatcher 定义路由的回调函数可以无缝缓存。通过使用 cachedDispatcher 而不是 simpleDispatcher,可以缓存生成的路由数据并从缓存的信息构建调度。

<?php
$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute(&#39;GET&#39;, &#39;/user/{name}/{id:[0-9]+}&#39;, &#39;handler0&#39;);
    $r->addRoute(&#39;GET&#39;, &#39;/user/{id:[0-9]+}&#39;, &#39;handler1&#39;);
    $r->addRoute(&#39;GET&#39;, &#39;/user/{name}&#39;, &#39;handler2&#39;);
}, [
    &#39;cacheFile&#39; => __DIR__ . &#39;/route.cache&#39;, /* required 缓存文件路径,必须设置 */
    &#39;cacheDisabled&#39; => IS_DEBUG_ENABLED,     /* optional, enabled by default 是否缓存,可选参数,默认情况下开启 */
]);
로그인 후 복사

该函数的第二个参数是一个选项数组,可用于指定缓存文件路径等等。

调度 URI

通过调用 dispatch() 调度 URI。这个方法接受 HTTP 方法 和一个 URI 作为参数。获得这两个信息是你自己的工作,这个库并不绑定到 PHP web SAPIs 。

dispatch() 返回一个数组,第一个元素是一个状态码,状态码是 Dispatcher::NOT_FOUNDDispatcher::METHOD_NOT_ALLOWEDDispatcher::FOUND 其中之一。对于 Dispatcher::METHOD_NOT_ALLOWED 状态,第二个数组元素包含允许提供的 URI 的 HTTP 方法列表。

[FastRoute\Dispatcher::METHOD_NOT_ALLOWED, [&#39;GET&#39;, &#39;POST&#39;]]
로그인 후 복사

对于 Dispatcher::FOUND 状态,第二个数组元素是 $handler ,第三个数组元素是是一个包含所有占位符的数组

/* Routing against GET /user/nikic/42 */
[FastRoute\Dispatcher::FOUND, &#39;handler0&#39;, [&#39;name&#39; => &#39;nikic&#39;, &#39;id&#39; => &#39;42&#39;]]
로그인 후 복사

重写路由解析器和调度器

这个库使用三个组件,一个路由解析器,一个数据生成器,一个调度器。这个三个组件实现以下接口

<?php
namespace FastRoute;
interface RouteParser {
    public function parse($route);
}
interface DataGenerator {
    public function addRoute($httpMethod, $routeData, $handler);
    public function getData();
}
interface Dispatcher {
    const NOT_FOUND = 0, FOUND = 1, METHOD_NOT_ALLOWED = 2;
    public function dispatch($httpMethod, $uri);
}
로그인 후 복사

路由解析器获取路由模式字符串并将其转换为路由信息数组,其中每个路线信息又是它的部分数组。

/* The route /user/{id:\d+}[/{name}] converts to the following array: */
[
    [
        &#39;/user/&#39;,
        [&#39;id&#39;, &#39;\d+&#39;],
    ],
    [
        &#39;/user/&#39;,
        [&#39;id&#39;, &#39;\d+&#39;],
        &#39;/&#39;,
        [&#39;name&#39;, &#39;[^/]+&#39;],
    ],
]
로그인 후 복사

然后可以将该数组传递给数据生成器的 addRoute() 方法,在添加了所有路由之后,调用生成器的 getData(),它将返回调度器所需的所有路由数据。

调度程序通过构造函数接受路由数据,并提供 dispatch()方法。

路由解析器可以被单独覆盖,然而数据生成器和调度器应该总是一起修改,因为前者的输出与后者的输入紧密耦合。

当使用 simpleDispatcher / cachedDispatcher 时,可以通过传入额外的参数,进行覆盖

<?php
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    /* ... */
}, [
    &#39;routeParser&#39; => &#39;FastRoute\\RouteParser\\Std&#39;,
    &#39;dataGenerator&#39; => &#39;FastRoute\\DataGenerator\\GroupCountBased&#39;,
    &#39;dispatcher&#39; => &#39;FastRoute\\Dispatcher\\GroupCountBased&#39;,
]);
로그인 후 복사

上面给出了默认的设置,通过把 GroupCountBased 替换成 GroupPosBased 可以使用完全不同的调度策略

关于HEAD请求的说明

HTTP 规范要求服务器 同时支持 GET HEAD 方法

GETHEAD方法必须得到所有通用服务器的支持

사용자가 각 리소스에 대해 HEAD 경로를 수동으로 등록하지 않도록 하기 위해 요청은 일치하는 GET 경로로 응답됩니다. PHP 웹 SAPI는 HEAD 응답에서 엔터티 본문을 투명하게 제거하므로 이 동작은 대다수의 사용자에게 영향을 미치지 않습니다. HEAD 路由,将使用一个匹配的 GET 路由响应请求。PHP web SAPI 透明地从 HEAD 响应中移除实体主体,所以这种行为对绝大多数用户没有影响。

但是,在 Web SAPI 环境外部使用 FastRoute ,绝不能发送响应 HEAD 请求而生成的实体主体,如果你是非 SAPI 用户,这是你的责任;在这种情况下,FastRoute 无权限制你破坏 HTTP 。

最后,请注意,应用程序可以始终为给定资源指定其自己的 HEAD

그러나 웹 SAPI 환경 외부에서 FastRoute를 사용하는 경우 HEAD 요청에 대한 응답으로 생성된 엔터티 본문을 보내서는 안 됩니다. SAPI 사용자가 아닌 경우 이는 귀하의 책임입니다. 이 경우 FastRoute HTTP를 깨는 데 제한이 없습니다.

마지막으로, 애플리케이션은 항상 특정 리소스에 대해 자체 HEAD 메서드 경로를 지정하여 이 동작을 완전히 우회할 수 있다는 점에 유의하세요.

추천 튜토리얼: "🎜PHP 튜토리얼🎜"🎜

위 내용은 PHP 라우팅 라이브러리 FastRoute 사용에 대한 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

이전에 몰랐던 후회되는 PHP 함수 7가지 이전에 몰랐던 후회되는 PHP 함수 7가지 Nov 13, 2024 am 09:42 AM

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. Apr 05, 2025 am 12:04 AM

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

문자열로 모음을 계산하는 PHP 프로그램 문자열로 모음을 계산하는 PHP 프로그램 Feb 07, 2025 pm 12:12 PM

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). Apr 03, 2025 am 12:04 AM

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? Apr 03, 2025 am 12:03 AM

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.

See all articles