Table of Contents
router.lua
Router
安装
此处附README里面的一个例子:
启动服务
测试
性能
DEMO
Home Backend Development PHP Tutorial 一个PHP的微型路由控制器

一个PHP的微型路由控制器

Jun 23, 2016 pm 01:25 PM

一个PHP的微型路由控制器

之前使用dispatch, 但是从4.0到现在的8.0 API变动比较大,特别是在最近两次大的版本的升级,为了保持代码简洁丢失了向下兼容的特性。
感觉作者的的核心思想不是很坚定。所以生出了自己造轮子的冲动。

router.lua

这个是一个微型的可以在openresty里面运行的路由控制器,曾经帮作者做了一次重大改版,现在还是这个项目第二贡献者。
其中的思想是很值得借鉴的:

  • 使用树形结构来保存url和handler的映射关系。(按照树形结构查找保证了查找回调函数的效率Olog(n),
    而传统的以正则表达式做key映射handler方式,查找回调函数时间不稳定,最坏情况需要执行一遍所有的正则表达式)

  • 将reqest method定义成是match函数的一个封装形式。便于提供方便的形式来映射路由。

  • Router

    鉴于以上两个非常好的特性,所以就把这个lua的库在PHP下面重写了一遍。同时在写的过程中加入了一些新的特性:

  • 增加error这个API,一个API提供两种调用方式(这个借鉴了dispatch里面的一些特性,有点像jquery的某些方法),可以兼具定义error handler和触发error handler的作用。

  • 增加hook API,同样有两种调用方式。

  • 默认触发“before”和“after”两个hook。分别在执行真正的handler前后。

  • 在“before”这个hook后面执行用户自定义的hook,这些hook是在定义回调函数的时候一起给定当前url需要调用的hook列表。(当然这些hook全部都要用户自己定义回调函数)

  • 安装

    这个微型的路由控制器已经提交到packagist网站,可以通过composer工具安装

    composer require lloydzhou/router
    Copy after login

    此处附README里面的一个例子:

    (new Router())/* 定义错误处理函数 */->error(401, function($message){    header('Location: /login', true, 302);    die($message);})->error(405, function($message){    header('Location: /hello/world', true, 302);})->error(406, function($message){    die($message);})/* 定义hook函数,除了内置默认调用的before和after,还定义了检查登录的auth */->hook('auth', function($params){    if ('lloyd' == $params['name'])    return $params;    $params['router']->error(401, 'Forbiden');})/* 定义after这个钩子函数,支持json或者jsonp格式输出 */->hook('after', function($result, $router){    if ($result) {    header('Content-type: application/'. ($_GET['jsoncallback']?'javascript':'json'));    if ($_GET['jsoncallback'])        print $_GET['jsoncallback']. '('. json_encode($result). ')';    else print json_encode($result);    }})->hook('before', function($params){    //$params['name'] = 'lloydzhou';    return $params;})/* 定义url映射 */->get('/', function(){    echo "Hello world !!!";})->get('/hello/:name', function($name){    echo "Hello $name !!!";})->get('/hello/:name/again', function($name){    echo "Hello $name again !!!";}, 'auth')->get('/hello/:name.:ext', function($name, $ext){    if ('js' == $ext || 'json' == $ext) return array('name'=>$name);    return array('code'=>1, 'msg'=>'error message...');}, 'auth')/* 程序入口,以当前的url查找对应的处理函数,并获取变量执行该函数 */->execute();
    Copy after login

    启动服务

    php -S 0.0.0.0:8888 test.php
    Copy after login

    测试

    curl -vvv 127.0.0.1:8888/hello/url未能映射成功,触发405错误处理函数, 自动跳转向 URL: "/hello/world"curl -vvv 127.0.0.1:8888/hello/lloyd 返回 "Hello lloyd !!!"curl -vvv 127.0.0.1:8888/hello/lloyd/again 返回 "Hello lloyd again !!!"curl -vvv 127.0.0.1:8888/hello/world/again 在钩子函数auth处理失败触发401错误处理函数, 自动跳转到 URL: "/login"curl -vvv 127.0.0.1:8888/hello/lloyd.json 支持“/”和“.”作为pathinfo的分隔符,并且和after钩子函数配合,返回json格式文本 {"name": "lloyd"}curl -vvv 127.0.0.1:8888/hello/lloyd.js?jsoncallback=test返回jsonp格式文本 test({"name": "lloyd"})curl -vvv 127.0.0.1:8888/hello/lloyd.jsx?jsoncallback=test最后的后缀名不匹配,输出错误jsonp格式的消息 test({"code":1,"msg":"error message..."})
    Copy after login

    性能

    使用树形结构来保存url和handler的映射关系。查找URL映射函数的时候保证了查找回调函数的效率O(log n)。
    而传统的以正则表达式做key映射handler方式,查找回调函数时间不稳定,最坏情况需要执行一遍所有的正则表达式。

    DEMO

    为了一边测试,一边完善这个库。所以使用这个库结合另外一个ActiveRecord和MicroTpl 写了一个简单的博客,里面基本涵盖了这几个库的API。

    Statement of this Website
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

    Hot AI Tools

    Undresser.AI Undress

    Undresser.AI Undress

    AI-powered app for creating realistic nude photos

    AI Clothes Remover

    AI Clothes Remover

    Online AI tool for removing clothes from photos.

    Undress AI Tool

    Undress AI Tool

    Undress images for free

    Clothoff.io

    Clothoff.io

    AI clothes remover

    AI Hentai Generator

    AI Hentai Generator

    Generate AI Hentai for free.

    Hot Article

    R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
    3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Best Graphic Settings
    3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. How to Fix Audio if You Can't Hear Anyone
    3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

    Hot Tools

    Notepad++7.3.1

    Notepad++7.3.1

    Easy-to-use and free code editor

    SublimeText3 Chinese version

    SublimeText3 Chinese version

    Chinese version, very easy to use

    Zend Studio 13.0.1

    Zend Studio 13.0.1

    Powerful PHP integrated development environment

    Dreamweaver CS6

    Dreamweaver CS6

    Visual web development tools

    SublimeText3 Mac version

    SublimeText3 Mac version

    God-level code editing software (SublimeText3)

    PHP Logging: Best Practices for PHP Log Analysis PHP Logging: Best Practices for PHP Log Analysis Mar 10, 2025 pm 02:32 PM

    PHP logging is essential for monitoring and debugging web applications, as well as capturing critical events, errors, and runtime behavior. It provides valuable insights into system performance, helps identify issues, and supports faster troubleshoot

    Working with Flash Session Data in Laravel Working with Flash Session Data in Laravel Mar 12, 2025 pm 05:08 PM

    Laravel simplifies handling temporary session data using its intuitive flash methods. This is perfect for displaying brief messages, alerts, or notifications within your application. Data persists only for the subsequent request by default: $request-

    cURL in PHP: How to Use the PHP cURL Extension in REST APIs cURL in PHP: How to Use the PHP cURL Extension in REST APIs Mar 14, 2025 am 11:42 AM

    The PHP Client URL (cURL) extension is a powerful tool for developers, enabling seamless interaction with remote servers and REST APIs. By leveraging libcurl, a well-respected multi-protocol file transfer library, PHP cURL facilitates efficient execution of various network protocols, including HTTP, HTTPS, and FTP. This extension offers granular control over HTTP requests, supports multiple concurrent operations, and provides built-in security features.

    Simplified HTTP Response Mocking in Laravel Tests Simplified HTTP Response Mocking in Laravel Tests Mar 12, 2025 pm 05:09 PM

    Laravel provides concise HTTP response simulation syntax, simplifying HTTP interaction testing. This approach significantly reduces code redundancy while making your test simulation more intuitive. The basic implementation provides a variety of response type shortcuts: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

    12 Best PHP Chat Scripts on CodeCanyon 12 Best PHP Chat Scripts on CodeCanyon Mar 13, 2025 pm 12:08 PM

    Do you want to provide real-time, instant solutions to your customers' most pressing problems? Live chat lets you have real-time conversations with customers and resolve their problems instantly. It allows you to provide faster service to your custom

    Explain the concept of late static binding in PHP. Explain the concept of late static binding in PHP. Mar 21, 2025 pm 01:33 PM

    Article discusses late static binding (LSB) in PHP, introduced in PHP 5.3, allowing runtime resolution of static method calls for more flexible inheritance.Main issue: LSB vs. traditional polymorphism; LSB's practical applications and potential perfo

    Customizing/Extending Frameworks: How to add custom functionality. Customizing/Extending Frameworks: How to add custom functionality. Mar 28, 2025 pm 05:12 PM

    The article discusses adding custom functionality to frameworks, focusing on understanding architecture, identifying extension points, and best practices for integration and debugging.

    See all articles