trulyao / php-router
PHP 简单的 Express 风格路由器
Requires
- php: >=7.4
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^9
README
PHP-Router 是一个现代、快速且可定制的 composer 包,它为 PHP 提供了框架无关的 Express 风格路由。
本网站由该包提供支持 -> 查看网站
安装
composer require trulyao/php-router
创建一个新的使用此包的 dockerized PHP 项目(包含 MySQL、Apache2、PHPMyAdmin),通过运行以下 Composer 命令
composer create-project trulyao/php-starter hello-world
更新 .htaccess 文件
这对于路由器正确运行至关重要。
警告:根据您的 Apache 配置,某些头部信息可能不允许传递到您的应用程序,这与该包无关,您只需在 Apache 配置中启用它们即可。
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteCond %{REQUEST_URI} !=/index.php
RewriteCond %{REQUEST_URI} !.*\.png$ [NC]
RewriteCond %{REQUEST_URI} !.*\.jpg$ [NC]
RewriteCond %{REQUEST_URI} !.*\.css$ [NC]
RewriteCond %{REQUEST_URI} !.*\.gif$ [NC]
RewriteCond %{REQUEST_URI} !.*\.js$ [NC]
RewriteRule .* /index.php
RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L]
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
特性
- 开源
- 快速且易于使用的语法
- 提供请求和响应对象
- 支持动态路由,如
/:id
或/:id/:name
- 支持 4 个 主要 HTTP 方法(GET、POST、PUT、DELETE)
- 使用回调处理请求
- 支持自定义 404 和 500 错误页面
- 支持重定向
- 提供静态文件、JSON 等服务
- 提供发送 JSON、设置状态码等常见任务的辅助函数
- 支持基于函数和类的控制器和中间件
用法
index.php
<?php use \Trulyao\PhpRouter\Router as Router; $router = new Router(__DIR__."/views", "demo"); $router->get("/", function($req, $res) { return $res->send("<h1>Hello World</h1>") ->status(200); }); $router->get('/render', function ($req, $res) { return $res->render("second.html", $req); }); $router->post("/", function($req, $res) { return $res->send([ "message" => "Hello World" ]); }); # using a class based controller $router->delete("/", [new NoteController(), "destroy"]); $router->route("/chained") ->get(function ($req, $res) { return $res->send("GET - Chained!"); }) ->post(function ($req, $res) { return $res->send("POST - Chained!"); }); # Start the router - very important! $router->serve(); ?>
/views
- 存放您的视图/控制器/源文件的目录。
/demo
- 这是您应用程序的基础 URL,例如 api
对应 /api/*
或 v1
对应 /v1/*
。
请求对象 $req
$req
对象包含请求数据,它还具有访问这些数据的辅助方法。
-
query("name")
- 返回给定名称的查询字符串值,如果没有给定名称,则返回所有查询字符串值。 -
body("name")
- 返回给定名称的请求体值,如果没有给定名称,则返回所有请求体值。 -
params("name")
- 返回给定名称的参数值,如果没有给定名称,则返回所有文件值。 -
path()
- 获取当前完整请求路径。 -
headers()
- 获取所有请求头部。 -
header("name")
- 获取单个请求头部值。 -
append($key, $value)
- 将数据添加到请求对象。 -
data
- 请求对象的数据数组(用于将数据传递到中间件和回调函数)。
注意:将
$req
对象传递到所有中间件和回调函数。如果您使用任何响应方法,如send()
,则中间件将不会移动到下一个。
响应对象 $res
$res
对象用于控制响应并持有与响应相关的数据。就像请求对象一样,它也包含您可以使用的各种方法。
error($message, $status)
- 发送 JSON 错误响应。send($data)
- 发送 JSON/HTML 响应;自动检测。json($data)
- 发送 JSON 响应。render($file)
- 使用内置的迷你模板引擎渲染视图,您也可以传递自己的数据。redirect($path)
- 重定向到另一个路径 - 例如/example/login
status($status)
- 设置状态码(默认为 200,可选)use_engine()
- 启用并使用内置的迷你模板引擎进行视图渲染。
未来还将添加更多方法。
您也可以通过使用命名空间 Trulyao\PhpRouter\HTTP
在您的索引或主文件外部访问这些函数。您也不受任何特定的编码风格或变量命名规范的约束。
错误页面
您可以通过在 /views
目录(或您的基准路径;控制器或视图的位置)中创建名为 404.php
、405.php
或 500.php
的文件来轻松添加自定义的 404、405 或 500 页面。
视图 & 模板
默认情况下,在视图中,您将获得以下变量
query
- 查询字符串值。body
- 请求正文值。params
- 请求参数值。headers
- 请求头。data
- 用户定义的数据,例如 JWT 中的当前用户root_dir
- 当前请求路径。
注意:在视图中访问头时,它们是不区分大小写的。此包还附带了一个默认关闭的模板引擎,您可以通过将布尔值传递给
render
方法来启用或禁用它。此模板引擎仍然是实验性的,并且尚不支持许多功能。请查看 此文件 了解如何使用它的示例。
您可以使用 $query['field_name']、$data['field_name'] 等,在 PHP 视图文件中使用这些变量,或者在模板文件(最可能是 HTML)中使用类似 @query('field_name')、@body() 的指令。
组件和原始代码
您可以通过使用 @php ... @endphp
指令在视图中执行一些 PHP 代码。这相当有限,但适用于不输出任何内容的代码,例如 session_start()
函数,因为所有输出都在视图文件顶部。
@php session_start(); @endphp
您还可以使用 @component
指令包含组件文件。
@component('component.html')
有关更多示例,请查看 示例目录。如果您已分叉和/或克隆此存储库;要启动测试服务器,请运行 composer run start:dev
,基本 URL 为 https://:20000/demo
。以下是所有可用的端点
- [GET]
/
- [GET]
/render
- [GET]
/render/middleware
- [GET]
/json
- [GET]
/dynamic/:id
- [GET]
/dynamic/:id/nested
- [GET]
/dynamic/:id/:name
- [GET]
/middleware
- [GET]
/redirect
- [POST]
/:id
- [PUT]
/:id
- [DELETE]
/:id
- [GET | POST | PUT | DELETE]
/chained
贡献
- 在 GitHub 上分叉存储库
- 添加您自己的代码
- 创建一个带有更改高亮的拉取请求
- 如需更多信息,请联系我 在此
当包中添加新特性和方法时,此文档将立即更新。
警告:PHP,就像许多其他语言一样,是从上到下运行的,为了避免冲突,请将链式路由放在文件底部;它仍然相当不稳定,可能会覆盖您的动态路由,例如,在一个GET请求中将链式路由
/chained
放在/:id
之前,只会引导您到/chained
路由,因为从技术上讲,它匹配后者。使用类似http://domain.com/work#web
的URL,在#
符号之后将不会返回任何内容,这不是此包或PHP的问题,浏览器永远不会将此数据发送到服务器。有关讨论,请参阅 此处