一个PHP的微型路由控制器
一个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
此处附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();
启动服务
php -S 0.0.0.0:8888 test.php
测试
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..."})
性能
使用树形结构来保存url和handler的映射关系。查找URL映射函数的时候保证了查找回调函数的效率O(log n)。
而传统的以正则表达式做key映射handler方式,查找回调函数时间不稳定,最坏情况需要执行一遍所有的正则表达式。
DEMO
为了一边测试,一边完善这个库。所以使用这个库结合另外一个ActiveRecord和MicroTpl 写了一个简单的博客,里面基本涵盖了这几个库的API。

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











In PHP, password_hash and password_verify functions should be used to implement secure password hashing, and MD5 or SHA1 should not be used. 1) password_hash generates a hash containing salt values to enhance security. 2) Password_verify verify password and ensure security by comparing hash values. 3) MD5 and SHA1 are vulnerable and lack salt values, and are not suitable for modern password security.

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP type prompts to improve code quality and readability. 1) Scalar type tips: Since PHP7.0, basic data types are allowed to be specified in function parameters, such as int, float, etc. 2) Return type prompt: Ensure the consistency of the function return value type. 3) Union type prompt: Since PHP8.0, multiple types are allowed to be specified in function parameters or return values. 4) Nullable type prompt: Allows to include null values and handle functions that may return null values.

PHP is still dynamic and still occupies an important position in the field of modern programming. 1) PHP's simplicity and powerful community support make it widely used in web development; 2) Its flexibility and stability make it outstanding in handling web forms, database operations and file processing; 3) PHP is constantly evolving and optimizing, suitable for beginners and experienced developers.

PHP is mainly procedural programming, but also supports object-oriented programming (OOP); Python supports a variety of paradigms, including OOP, functional and procedural programming. PHP is suitable for web development, and Python is suitable for a variety of applications such as data analysis and machine learning.

PHP and Python have their own advantages and disadvantages, and the choice depends on project needs and personal preferences. 1.PHP is suitable for rapid development and maintenance of large-scale web applications. 2. Python dominates the field of data science and machine learning.

Using preprocessing statements and PDO in PHP can effectively prevent SQL injection attacks. 1) Use PDO to connect to the database and set the error mode. 2) Create preprocessing statements through the prepare method and pass data using placeholders and execute methods. 3) Process query results and ensure the security and performance of the code.
