medina1402/php-router

v1.0.4-beta 2022-01-08 01:11 UTC

This package is auto-updated.

Last update: 2024-09-15 16:38:47 UTC


README

PHPRouter 为 Web 开发或 API 开发提供快速且易于使用的路由基础设施,非常适合小型项目。

License MIT Language Program

使用 Composer 安装

执行以下脚本将添加资源

composer require medina1402/php-router dev-main

当添加依赖项时,必须创建一个文件来加载 Composer 内容

<?php
require_once __DIR__ . '/vendor/autoload.php';
...

基本路由

要创建路由,我们需要两个主要实例,如下所示

$router = new Router();
$application = new Application($router);

$router->get("/", function () {
    echo "Hello world";
});

$application->run();

尽管上面的方法是可行的,但不建议这样做,因为这两个类是为了对回调函数的传入值进行某种类型转换而创建的: 请求响应

$router = new Router();
$application = new Application($router);

$router->get("/", function (Request $req, Response $res) {
    $res->send("Hello world");
});

$application->run();

如果我们想添加路由,有两种选择,一种是紧接在最后一个方法之后添加

...
$router
    ->get("/", function (Request $req, Response $res) {
        $res->send("Get");
    })
    ->post("/", function (Request $req, Response $res) {
        $res->send("Post");
    });
...

或者使用主变量

...
$router->get("/", function (Request $req, Response $res) {
    $res->send("Get");
});

$router->post("/", function (Request $req, Response $res) {
    $res->send("Post");
});
...

动态路由

有时路由由动态数据组成,例如,在创建用户并希望访问他们的信息时,一个选项是他们标识符是 URL 的一部分

...
$router->get("/user/:id/profile", function (Request $req, Response $res) {
    $idUser = $req->getValue("id");
    $res->send("user id: " . $idUser);
});
...

通过放置冒号,我们表示它必须变成具有相同名称的变量。

    match("/user/:id/profile", "/user/12548/profile") ==> true
    - id = 12548
    
    match("/:one/:two/:three/:four", "/a/b/c/d") ==> true
    - one   = "a"
    - two   = "b"
    - three = "c"
    - four  = "d"
     
    match("/:one/:two/:three/:four", "/a/b/c/d/e") ==> false
    match("/:one/:two/:three/:four", "/a/b/c/") ==> false
    match("/user/:id/profile", "/user/12548/other") ==> false

多个路由器

我们有单独处理每个 Router 实例并最终将它们连接起来的可能性,这为基于模块的架构提供了可能性。

// file: module/User
$routerUser = new Router();
$routerUser
    ->get("/user/:id", function (Request $req, Response $res) {
        $res->send("Get " . $req->getValue("id"));
    })
    ->post("/user/:id", function (Request $req, Response $res) {
        $res->send("Post " . $req->getValue("id"));
    })
    ->put("/user/:id", function (Request $req, Response $res) {
        $res->send("Put " . $req->getValue("id"));
    })
    ->delete("/user/:id", function (Request $req, Response $res) {
        $res->send("Delete " . $req->getValue("id"));
    });

// file: index
...
$router = new Router();
$application = new Application($router);
$router->using($routerUser);

$router->get("/", function (Request $req, Response $res) {
    $res->send("Hello world");
});

$application->run();

如果我们有多个 Router,我们可以将它们通过一个数组添加到新的 Router 中

...
$router->usingArray([$routerUser, $other1, $other2, ...]);
...

默认路由

我们可以为每个需要的方法分配一个默认路由,这个路由将具有相应的回调和中间件,但如果找不到现有路由,则只会执行它

...
$router = new Router();

$router->get("/user/:id", function (Request $req, Response $res) {
    $res->send("Hello world " . $req->getValue("id"));
}, $middleware);

$router->default("get", function (Request $req, Response $res) {
    $res->send("<div> <h1>Error 404<h1> <a href='/'>return home</a> </div>");
});
...
    - "/user/:id", "/user/125" => "Hello world 125"
    - "/user/:id", "/user"     => "<div> <h1>Error 404<h1> <a href='/'>return home</a> </div>"

中间件

中间件是在主控制器之前运行的,它适合检查参数,因为它接收与控制器相同的参数。

...
$middleware = function (Request $req, Response $res) {
    if ( !$req->getValue("id") ) $res->send("User ID no found");
};

$router->get("/user/:id", function (Request $req, Response $res) {
    $res->send("Hello world " . $req->getValue("id"));
}, $middleware);

// OR

$router->get("/user/:id", function (Request $req, Response $res) {
    $res->send("Hello world " . $req->getValue("id"));
}, function (Request $req, Response $res) {
    if ( !$req->getValue("id") ) $res->send("User ID no found");
});
...