Slim 3的路由是建立在组件nikic/fastroute的基础上的,在性能上更快,更稳。
创建路由
你可以使用 \Slim\App
的实例的代理方法定义应用路由,Slim
提供了方法去创建RestFul
的http
方法。
Get路由(从服务器取出资源(一项或多项)[对应的SQL命令:SELECT])
你可以通过slim应用的get()
方法去添加一个路由专门处理GET
的HTTP
请求,get()
方法接收两个参数:
1.路由匹配模式(也可以有可选的命名参数占位符)
2.回调函数
$app = new \Slim\App();
$app->get('/books/{id}', function ($request, $response, $args) {
//通过id获取book信息
});
Post路由(在服务器新建一个资源 [对应的SQL命令:CREATE])
你可以通过slim
应用的post()
方法去添加一个路由专门处理POST
的HTTP
请求,post()
方法接收两个参数:
1.路由匹配模式(也可以有可选的命名参数占位符)
2.回调函数
$app = new \Slim\App();
$app->post('/books', function ($request, $response, $args) {
// 新增一本书
});
Put路由(在服务器更新资源(客户端提供改变后的完整资源)。[对应的SQL命令:UPDATE])
你可以通过slim
应用的put()
方法去添加一个路由专门处理PUT
的HTTP
请求,put()
方法接收两个参数:
1.路由匹配模式(也可以有可选的命名参数占位符)
2.回调函数
$app = new \Slim\App();
$app->put('/books/{id}', function ($request, $response, $args) {
// 通过id更新书的信息
});
Delete路由(从服务器删除资源。[对应的SQL命令:DELETE])
你可以通过slim
应用的delete()
方法去添加一个路由专门处理DELETE
的HTTP
请求,delete()
方法接收两个参数:
1.路由匹配模式(也可以有可选的命名参数占位符)
2.回调函数
$app = new \Slim\App();
$app->delete('/books/{id}', function ($request, $response, $args) {
// 通过id删除书
});
Options路由(获取信息,关于资源的哪些属性是客户端可以改变的。[不常用])
你可以通过slim
应用的options()
方法去添加一个路由专门处理OPTIONS
的HTTP
请求,options()
方法接收两个参数:
1.路由匹配模式(也可以有可选的命名参数占位符)
2.回调函数
$app = new \Slim\App();
$app->options('/books/{id}', function ($request, $response, $args) {
// 获取信息
});
PATCH路由(在服务器更新资源(客户端提供改变的属性)。[对应的SQL命令:DELETE])
你可以通过slim
应用的patch()
方法去添加一个路由专门处理PATCH
的HTTP
请求,patch()
方法接收两个参数:
1.路由匹配模式(也可以有可选的命名参数占位符)
2.回调函数
$app = new \Slim\App();
$app->patch('/books/{id}', function ($request, $response, $args) {
// 通过id更新书
});
Any路由
你可以通过slim
应用的any()
方法去添加一个路由处理任何形式的HTTP
请求,any()
方法接收两个参数:
1.路由匹配模式(也可以有可选的命名参数占位符)
2.回调函数
$app = new \Slim\App();
$app->any('/books/[{id}]', function ($request, $response, $args) {
// 匹配任何形式的请求
});
注意,第二个参数是一个回调,你可以写一个类去代替闭包(但是类必须实现了方法__invoke()), 像下面这样:
$app->any('/user', 'MyRestfulController');
自定义路由
你可以通过slim
应用的map()
方法去添加一个路由处理多种形式的HTTP
请求,map()
方法接收三个参数:
1.路由数组
2.路由匹配模式(也可以有可选的命名参数占位符)
3.回调函数
$app = new \Slim\App();
$app->map(['GET', 'POST'], '/books', function ($request, $response, $args) {
// 新增一本书或者列出书的列表
});
路由回调
任何一条上面说的路由,都接收一个回调作为最后一个参数。这个参数可以是PHP的任何回调的形式,并且回调默认接收三个参数:
Request:第一个参数是一个 Psr\Http\Message\ServerRequestInterface
对象,表示当前的HTTP请求
Response:第二个参数是一个 Psr\Http\Message\ResponseInterface
对象,表示当前的HTTP请求的响应
Arguments:第三个参数是一个索引数组,数组的值时当前路由匹配的参数占位符的值
内容输出到响应
有两种方式把内容输出到响应里面,第一种是直接使用echo在回调函数里面把内容输出,这种方式会把内容追加到响应对象里面。另一种方式是返回一个 Psr\Http\Message\ResponseInterface
对象。
闭包绑定
假如你使用一个闭包实例作为路由的回调参数,闭包实例的状态绑定到了容器实例里面。也就是说,你在闭包函数里面可以通过关键字 $this
使用依赖注入的容器实例。
$app = new \Slim\App();
$app->get('/hello/{name}', function ($request, $response, $args) {
// Use app HTTP cookie service
$this->get('cookies')->set('name', [
'value' => $args['name'],
'expires' => '7 days'
]);
});
路由策略
路由回调的用法取决于你的路由策略。默认情况下,Slim希望你的路由回调接收三个参数:请求,响应,和一个由路由参数的值组成的索引数组。这就叫着请求响应策略。但是,你可以使用另一种策略方式去改变默认的策略。例如:Slim提供了一个叫着路由响应参数策略的方式去替代默认的策略,它接收三个参数:请求,响应,加上以逗号分隔的路由参数。下面的示例就是使用替代策略的。很简单的通过 \Slim\Container
替换了 foundHandler
依赖:
$c = new \Slim\Container();
$c['foundHandler'] = function() {
return new \Slim\Handlers\Strategies\RequestResponseArgs();
};
$app = new \Slim\App($c);
$app->get('/hello/{name}', function ($request, $response, $name) {
return $response->write($name);
});
你也可以使用你自己的路由策略,但是必须实现\Slim\Interfaces\InvocationStrategyInterface
接口。
路由占位符
任何一条上面描述的路由方法都接收一个URL模式去匹配当前HTTP请求的URI。路由模式通过使用命名占位符动态的匹配HTTP请求的URI段。
格式
一个路由模式占位符以 {
开始,接着就是参数占位符名称,然后以 }
结束。下面就是一个简单实例:
$app = new \Slim\App();
$app->get('/hello/{name}', function ($request, $response, $args) {
echo "Hello, " . $args['name'];
});
路由正则匹配
默认参数占位符写在 {}
里面,可以接收任何形式的值,参数占位符也可以强制要求HTTP请求URI只能接收一些符合正则表达式的参数。如果当前的HTTP请求URI无法匹配占位符的正则表达式,是无效的。下面就是一个例子,一个名为Id的参数占位符只能接收数字的值:
$app = new \Slim\App();
$app->get('/users/{id:[0-9]+}', function ($request, $response, $args) {
// Find user identified by $args['id']
});
命名路由
应用路由可以被赋予名字。这是非常有用的,假如你要给某一个特殊的路由通过方法 pathFor()
生成一条url,任何一条上面的说的路由方法都会返回一个对象 \Slim\Route
,对象包含一个方法 setName()
可以命名路由。
$app = new \Slim\App();
$app->get('/hello/{name}', function ($request, $response, $args) {
echo "Hello, " . $args['name'];
})->setName('hello');
你可以通过应用的路由方法 pathFor()
为一个命名过的路由生成url:
echo $app->router->pathFor('hello', [
'name' => 'Josh'
]);
// Outputs "/hello/Josh"
pathFor()
接收两个参数:
1.路由名称
2.索引数组(键名是参数占位符名称和代表的值)
路由群组
为了帮助管理路由把一些相关的功能放在一个逻辑群组里面,Slim提供了一个方法 group()
,任何一条群组路由的模式都会在追加在子路由的前面或者包含在里面,出现在群组路由匹配模式里面的参数占位符最终都会嵌套在子路由里面,看示例:
$app = new \Slim\App();
$app->group('/users/{id:[0-9]+}', function () {
$this->map(['GET', 'DELETE', 'PATCH', 'PUT'], '', function ($request, $response, $args) {
// Find, delete, patch or replace user identified by $args['id']
})->setName('user');
$this->get('/reset-password', function ($request, $response, $args) {
// Route for /users/{id:[0-9]+}/reset-password
// Reset the password for user identified by $args['id']
})->setName('user-password-reset');
});
注意,在群组闭包回调参数里面,通过使用$this代替$app,Slim帮你把闭包实例绑定到了应用实例中。
路由中间件
你也可以把中间件绑定到普通路由或者路由群组中。学习这边SLIM 3 文档(五)-中间件
文档翻译的并不是很专业,仅供个人学习作用,建议看官方文档。
如有兴趣,请看下一篇 SLIM 3 文档(十)-错误处理3)