trulyao/php-router

此包已被废弃,不再维护。没有建议的替代包。

PHP 简单的 Express 风格路由器

2.0.5 2022-09-07 13:09 UTC

This package is auto-updated.

Last update: 2023-02-07 13:57:35 UTC


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.php405.php500.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的问题,浏览器永远不会将此数据发送到服务器。有关讨论,请参阅 此处