Php 使用Slim 3的基于标头的路由
我有一个简单的3条路线:Php 使用Slim 3的基于标头的路由,php,rest,http,routing,slim,Php,Rest,Http,Routing,Slim,我有一个简单的3条路线:$app->get('/calendar/{date}',CalendarCtrl:getSchedule') 此路由可以通过简单的HTML列表、json或xml格式返回相同的计划。 现在,我正在寻找一个基于HTTP头的简单REST解决方案 例如: 请求: GET /calendar/2017-01-01 Accept: application/json 答复: Content-Type: application/json Body: {json schedule}
$app->get('/calendar/{date}',CalendarCtrl:getSchedule')代码>
此路由可以通过简单的HTML列表、json或xml格式返回相同的计划。
现在,我正在寻找一个基于HTTP头的简单REST解决方案
例如:
请求:
GET /calendar/2017-01-01
Accept: application/json
答复:
Content-Type: application/json
Body: {json schedule}
所以路由应该是这样的smth:$app->get('/calendar/{date}',{Accept:application/json},'CalendarCtrl:getScheduleJson')代码>
我知道我可以在路由处理程序中检查该标头。但我正在寻找一个简单的声明性解决方案。在从API发送响应之前,添加一个中间件来检查该头文件
$app->add(function ($req, $res, $next) {
//Checking for $req content-type here then send the response with the same one
//example
$headerValue= $req->getHeader('Accept');
if($headerValue=='application/json')
{
$response = $next($req, $res);
return $response
->withHeader('Content-type', 'application/json');
}
else{
//check for other header here
}
});
在从API发送响应之前,添加一个中间件来检查该标头
$app->add(function ($req, $res, $next) {
//Checking for $req content-type here then send the response with the same one
//example
$headerValue= $req->getHeader('Accept');
if($headerValue=='application/json')
{
$response = $next($req, $res);
return $response
->withHeader('Content-type', 'application/json');
}
else{
//check for other header here
}
});
谢谢你的想法。这对我来说是一个新概念,你能告诉我Slim中使用中间件的最佳实践是什么吗?您使用了匿名函数,Slim文档使用可调用类,其他指南扩展了Slim中间件(Slim 2)。您使用什么作为中间产品的最佳实践?谢谢还有一个问题:在Accept:text/html标题的情况下,我需要构建一个带有细枝模板呈现的html页面。它比简单的return$response->withHeader('Content-type','application/json')稍微复杂一些,但要复杂得多问题是:这种逻辑应该在中间件中吗?也许控制器是对的地方?如果是,我回到前面的问题:中间件不能解决基于头的路由问题。这根本不是一个路由。Slim中的中间件很简单,您将在API周围提供一个层,在将请求传递给API之前检查一些东西,并在响应中添加一些东西,然后将其发送给客户端。在Slim3中添加中间件很简单,就像我这里的代码一样,我使用add函数为中间件思想创建任何中间件层库。这对我来说是一个新概念,你能告诉我Slim中使用中间件的最佳实践是什么吗?您使用了匿名函数,Slim文档使用可调用类,其他指南扩展了Slim中间件(Slim 2)。您使用什么作为中间产品的最佳实践?谢谢还有一个问题:在Accept:text/html标题的情况下,我需要构建一个带有细枝模板呈现的html页面。它比简单的return$response->withHeader('Content-type','application/json')稍微复杂一些,但要复杂得多问题是:这种逻辑应该在中间件中吗?也许控制器是对的地方?如果是,我回到前面的问题:中间件不能解决基于头的路由问题。这根本不是一个路由。Slim中的中间件很简单,在将请求传递到API之前,您将在API周围提供一个层来检查某些内容,并在将其发送到客户端之前在响应中添加一些内容。在Slim3中,添加中间件很容易,就像我这里的代码一样,我使用添加功能创建任何中间件层