小状元 / srouter
简单的PHP路由类。
2.1.0
2018-12-19 11:16 UTC
Requires
- php: >=5.3.3
Requires (Dev)
- guzzle/guzzle: ~3.9
- phpunit/phpunit: ^4.8-stable
This package is auto-updated.
Last update: 2024-09-20 01:27:54 UTC
README
Srouter是一个简单、开源的PHP路由器。它非常小巧(约150行代码),速度快,并且拥有一些优秀的注释源代码。这个类允许你将其直接扔进你的项目中,并立即开始使用。
安装
如果你有Composer,只需将Srouter作为项目依赖项包含在你的composer.json
文件中。如果没有,只需下载.ZIP文件并将其解压到你的项目目录中。
require: {
"xiaozhuangyuan/srouter": "dev-master"
}
示例
首先,使用Srouter命名空间
use \Xiaozhuangyuan\Srouter\Srouter;
Srouter不是一个对象,因此你可以直接对该类进行操作。以下是一个简单的Hello World示例
Srouter::get('/', function() { echo 'Hello world!'; }); Srouter::dispatch();
Srouter还支持lambda URI,例如
Srouter::get('/(:any)', function($slug) { echo 'The slug is: ' . $slug; }); Srouter::dispatch();
你还可以在Srouter中为HTTP方法发起请求,因此你也可以这样做
Srouter::get('/', function() { echo 'I'm a GET request!'; }); Srouter::post('/', function() { echo 'I'm a POST request!'; }); Srouter::map(['get','post'],'/', function() { echo 'I can be both a GET and a POST request!'; }); Srouter::any('/', function() { echo 'I can be any request!'; }); Srouter::dispatch();
最后,如果没有为某个位置定义路由,你可以让Srouter运行一个自定义回调,如下所示
Srouter::error(function() { echo '404 :: Not Found'; });
如果你没有指定错误回调,Srouter将直接输出404
。
为了让服务器知道URI没有指向实际的文件,你可能需要使用以下示例配置文件之一。
示例:将请求传递到控制器而不是闭包
可以传递命名空间路径到控制器,而不是闭包在这个演示中,假设我有一个名为controllers的文件夹,里面有一个Test.php文件
index.php
require('vendor/autoload.php'); use Xiaozhuangyuan\Srouter\Srouter; Srouter::get('/', 'controllers\Test@index'); Srouter::get('page', 'controllers\Test@page'); Srouter::get('view/(:num)', 'controllers\Test@view'); Srouter::dispatch();
Test.php
<?php namespace controllers; class Test { public function index() { echo 'home'; } public function page() { echo 'page'; } public function view($id) { echo $id; } }
高级使用
index.php
require('vendor/autoload.php'); use Xiaozhuangyuan\Srouter\Router; $router = new Router(); $router->group('/v1', function () use ($router) { $router->group('', function () use($router) { $router->get('', 'app\controllers\Demo@index', ['Check']); }); $router->any('/nasad', 'app\controllers\Demo@index'); $router->map(['get', 'post'], '/page', 'app\controllers\Demo@page'); $router->get('/view/(:num)', 'app\controllers\Demo@view'); $router->get('/pi', 'app\controllers\Demo@pi'); $router->get('/db', 'app\controllers\Demo@db'); $router->get('/log', 'app\controllers\Demo@log'); $router->get('/cache', 'app\controllers\Demo@cache'); $router->group('/user', function ($router) { $router->get('/info', 'app\controllers\Demo@index'); $router->group('/user122', function ($router) { $router->get('/info', 'app\controllers\Demo@index'); }, ['PK']); }, ['Check']); $router->get('/qwwasas', 'app\controllers\Sms@qwqw'); }, ['Auth']); $router->dispatch();
Test.php
<?php namespace app\controllers; class Test { public function index() { echo 'home'; } public function page() { echo 'page'; } public function view($id) { echo $id; } }
中间件
Auth.php
<?php namespace app\middleware; use Xiaozhuangyuan\Srouter\Middleware; class Auth implements Middleware { public function handle() { return true; } }
这是通过composer安装Srouter的示例。
composer.json
{
"require": {
"xiaozhuangyuan/srouter": "dev-master"
},
"autoload": {
"psr-4": {
"" : ""
}
}
}
.htaccess(Apache)
Options +FollowSymlinks -Multiviews
RewriteEngine On
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php [L]
Nginx
location / {
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
break;
}
}