资讯专栏INFORMATION COLUMN

php的单文件路由

jayzou / 1955人阅读

摘要:非常轻量级的单一文件的路由器。会将真实的名作为参数传入需要你在此方法中调度来执行真正的请求方法。例如网站维护时可允许配置的值为路由将会直接执行此路由。

inhere/sroute 非常轻量级的单一文件的路由器。简洁、自定义性强

referrer the project noahbuschermacaw , but add some feature.

支持请求方法: GET POST PUT DELETE HEAD OPTIONS

支持事件: found notFound. 你可以做一些事情当触发事件时(比如记录日志等)

支持设置匹配路由的解析器: SRoute::setMatchedRouteParser(). 你可以自定义如何调用匹配的路由处理程序.

支持自动匹配路由到控制器就像 yii 一样, 请参看配置项 autoRoute.

支持手动调度一个路由通过方法 SRoute::dispatchTo()

你也可以不配置任何东西, 它也能很好的工作

安装
{
    "require": {
        "inhere/sroute": "dev-master"
    }
}
使用

首先, 导入类

use inheresrouteSRoute;
添加路由
// 匹配 GET 请求. 处理器是个闭包 Closure
SRoute::get("/", function() {
    echo "hello";
});

// 匹配参数 "test/john"
SRoute::get("/test/(w+)", function($arg) {
    echo $arg; // "john"
});

// 匹配 POST 请求
SRoute::post("/user/login", function() {
    var_dump($_POST);
});

// 匹配 GET 或者 POST
SRoute::map(["get", "post"], "/user/login", function() {
    var_dump($_GET, $_POST);
});

// 允许任何请求方法
SRoute::any("/home", function() {
    echo "hello, you request page is /home";
});

如果配置了 "ignoreLastSep" => true, "/index" 等同于 "/index/"

使用控制器方法
SRoute::get("/index", "appcontrollersHome@index");
动态匹配控制器方法

动态匹配控制器方法, 需配置 "dynamicAction" => true

NOTICE: 使用动态匹配控制器方法, 应当使用 any() 添加路由. 即此时无法限定请求方法 REQUEST_METHOD

// 访问 "/home/test" 将会执行 "appcontrollersHome::test()"
SRoute::any("/home/(w+)", appcontrollersHome::class);

// 可匹配 "/home", "/home/test" 等
SRoute::any("/home(/w+)?", appcontrollersHome::class);

上面两个的区别是 第一个无法匹配 /home

使用方法执行器

配置 actionExecutor 为你需要的方法名,例如配置为 "actionExecutor" => "run",那所有的方法请求都会提交给此方法。
会将真实的action名作为参数传入run($action), 需要你在此方法中调度来执行真正的请求方法。

在你需要将路由器整合到自己的框架时很有用

示例:

// 访问 "/user", 将会调用 appcontrollersUser::run("")
SRoute::get("/user", "appcontrollersUser");

// 访问 "/user/profile", 将会调用 appcontrollersUser::run("profile")
SRoute::get("/user/profile", "appcontrollersUser");

// 同时配置 "actionExecutor" => "run" 和 "dynamicAction" => true,
// 访问 "/user", will call appcontrollersUser::run("")
// 访问 "/user/profile", will call appcontrollersUser::run("profile")
SRoute::get("/user(/w+)?", "appcontrollersUser");
自动匹配路由到控制器

支持自动匹配路由到控制器就像 yii 一样, 需配置 autoRoute.

    "autoRoute" => [
        "enable" => 1, // 启用
        "controllerNamespace" => "examplescontrollers", // 控制器类所在命名空间
        "controllerSuffix" => "Controller", // 控制器类后缀
    ],
匹配所有

配置 "matchAll" 可用于拦截所有请求。 (例如网站维护时)

可允许配置 "matchAll" 的值为

路由path

    "matchAll" => "/about", // a route path

将会直接执行此路由。

回调

    "matchAll" => function () {
        echo "System Maintaining ... ...";
    },

将会直接执行此回调

设置事件处理(if you need)
SRoute::any("/404", function() {
    echo "Sorry,This page {$_GET["path"]} not found.";
});
// 成功匹配路由
SRoute::on(SRoute::FOUND, function ($uri, $cb) use ($app) {
    $app->logger->debug("Matched uri path: $uri, setting callback is: " . is_string($cb) ? $cb : get_class($cb));
});

// 当匹配失败, 重定向到 "/404"
SRoute::on("notFound", "/404");

// 或者, 当匹配失败, 输出消息...
SRoute::on("notFound", function ($uri) {
    echo "the page $uri not found!";
});
设置配置(if you need)
// set config
SRoute::config([
    "stopOnMatch" => true,
    "ignoreLastSep" => true,
    "dynamicAction" => true,
    
//    "matchAll" => "/", // a route path
//    "matchAll" => function () {
//        echo "System Maintaining ... ...";
//    },
    
    // enable autoRoute, work like yii framework
    // you can access "/demo" "/admin/user/info", Don"t need to configure any route
    "autoRoute" => [
        "enable" => 1,
        "controllerNamespace" => "examplescontrollers",
        "controllerSuffix" => "Controller",
    ],
]);

默认配置如下

// 所有的默认的配置
[
    // stop on matched. only match one
    "stopOnMatch" => true,
    // Filter the `/favicon.ico` request.
    "filterFavicon" => false,
    // ignore last "/" char. If is True, will clear last "/", so "/home" equals to "/home/"
    "ignoreLastSep" => false,

    // match all request.
    // 1. If is a valid URI path, will match all request uri to the path.
    // 2. If is a callable, will match all request then call it
    "matchAll" => "", // eg: "/site/maintenance" or `function () { echo "System Maintaining ... ..."; }`

    // auto route match @like yii framework
    "autoRoute" => [
        // If is True, will auto find the handler controller file.
        "enable" => false,
        // The default controllers namespace, is valid when `"enable" = true`
        "controllerNamespace" => "", // eg: "appcontrollers"
        // controller suffix, is valid when `"enable" = true`
        "controllerSuffix" => "",    // eg: "Controller"
    ],

    // default action method name
    "defaultAction" => "index",

    // enable dynamic action.
    // e.g
    // if set True;
    //  SRoute::any("/demo/(w+)", appcontrollersDemo::class);
    //  you access "/demo/test" will call "appcontrollersDemo::test()"
    "dynamicAction" => false,

    // action executor. will auto call controller"s executor method to run all action.
    // e.g
    //  `run($action)`
    //  SRoute::any("/demo/(:act)", appcontrollersDemo::class);
    //  you access `/demo/test` will call `appcontrollersDemo::run("test")`
    "actionExecutor" => "", // "run"
]

NOTICE: 必须在调用 SRoute::dispatch() 之前使用 SRoute::config() 来进行一些配置

开始路由分发
SRoute::dispatch();
运行示例

你可以通过 bash ./php_server 来运行一个测试服务器, 现在你可以访问 http://127.0.0.1:5670

项目地址

github

git@osc

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23035.html

相关文章

  • 采用vue+webpack构建的单页应用——私人博客MintloG诞生记

    摘要:我采用原生编写后台,因为感觉增删改查的功能很简单,就懒得用框架了其实是不会。浏览模式它也有一个,用来切换文章列表和文章详情,也就是和编辑模式它加载了作为工具栏,然后可以进行文章的撰写与修改。 介绍 项目地址:https://github.com/jrainlau/MintloG (特别乱,参考就好-_-|||)showImg(https://segmentfault.com/img/b...

    Terry_Tai 评论0 收藏0
  • 最适合入门的Laravel初级教程(四)

    摘要:最适合入门的初级教程四路由可以分发请求路由中还可以引入页面我们可以在中搞定一切了但是如果把业务逻辑都写入到路由中那路由将庞大的难以维护于是控制器就有了很明显的存在价值把业务逻辑写在控制器中路由只负责转发请求到指定的控制器即可那我们开始创建控 最适合入门的Laravel初级教程(四) 路由可以分发请求; 路由中还可以引入 html 页面;我们可以在 route/web.php 中搞定一切...

    gplane 评论0 收藏0
  • webpack配合vue.js实现完整的单页面demo

    摘要:本篇文章主要是我在开发前研究了的单页面应用,因为需要用到的,所以确保安装了,建议官网安装最新的稳定版本。本文章只是和大家探讨怎么利用配合做一个单页面应用,具体关于里面的内容怎么写并不在本篇文章的介绍范围。 本篇文章主要是我在开发前研究了webpack+vue.js的单页面应用,因为需要用到node的npm,所以确保安装了node,建议官网安装最新的稳定版本。并且在项目中需要加载一些np...

    2450184176 评论0 收藏0
  • 你需要知道的单页面路由实现原理

    摘要:显示为显示为显示为单页面应用用户访问轨迹埋点开发过单页面应用的同学,一定比较清楚,单页面应用的路由切换是无感知的,不会重新进行请求去获取页面,而是通过改变页面渲染视图来实现。 前言 最近开发的埋点项目,需要记录用户行为轨迹即用户页面访问顺序。需要在页面跳转的时候,记录用户访问的信息(比如 url ,请求头部等),非单页面应用可以给 window 对象加上一个 beforeunload ...

    light 评论0 收藏0
  • 一套Vue的单页模板:N3-admin

    摘要:趁着周末偷来一点闲,总结近期的工作和学习,想着该花点心思把这套基于的单页应用模板简单的给介绍一下。同时也是一套可扩展的单页应用开发模板。 趁着周末偷来一点闲,总结近期的工作和学习,想着该花点心思把N3-admin这套基于N3-components的单页应用模板简单的给介绍一下。 首发于个人博客;blog.lxstart.net项目路径: https://github.com/N3-co...

    CloudDeveloper 评论0 收藏0

发表评论

0条评论

jayzou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<