如何在Slim Framework v3路由内部调用API端点?
在Slim Framework v3中前端路由调用内部API端点的最佳方式
我正在使用PHP Slim Framework v3开发Web应用,路由分为前端路由与API端点两类。目前需要在前端路由中调用API端点获取数据用于展示,示例代码如下:
前端路由
$app->get('/order/{order-id}', function(Request $request, Response $response, array $args) { $order_id = intval($args['order-id']); $order_details = ______; // API endpoint call to get the order details $response = $this->view->render($response, 'order-details.html', [ 'order_details' => $order_details ]); return $response; });
API端点
$app->get('/api/order/{order-id}', function(Request $request, Response $response, array $args) use ($db) { $order_id = intval($args['order-id']); $order_details = $db->order_details($order_id); // Query the database for all the order details $response = $response->withJson($order_details); return $response; });
请问应在上述代码的______位置填写什么内容,才能获取/api/order/{order-id}端点返回的JSON数据?
注意:我考虑过使用Guzzle实现,但认为这对于当前需求过于冗余,希望找到Slim框架自带的实现方式。
方法1:直接复用API的业务逻辑(最简洁高效)
既然API端点的核心是调用$db->order_details($order_id)获取数据,直接在前端路由中复用这段逻辑即可,完全不需要额外的HTTP请求:
$app->get('/order/{order-id}', function(Request $request, Response $response, array $args) use ($db) { $order_id = intval($args['order-id']); // 直接复用API中的数据库查询逻辑 $order_details = $db->order_details($order_id); $response = $this->view->render($response, 'order-details.html', [ 'order_details' => $order_details ]); return $response; });
这是Slim项目中复用业务逻辑的常规做法,没有额外开销,性能最优。
方法2:模拟内部请求(完整走API路由流程)
如果必须触发API路由的完整流程(比如需要经过中间件校验、权限控制等),可以用Slim的App实例模拟内部请求,无需外部HTTP客户端:
$app->get('/order/{order-id}', function(Request $request, Response $response, array $args) { $order_id = intval($args['order-id']); // 构建指向API端点的内部请求 $apiRequest = $request->withUri( $request->getUri()->withPath("/api/order/{$order_id}") )->withMethod('GET'); // 调度API路由的处理逻辑,获取响应 $apiResponse = $this->app->process($apiRequest, new \Slim\Http\Response()); // 解析JSON响应体为数组 $order_details = json_decode($apiResponse->getBody(), true); $response = $this->view->render($response, 'order-details.html', [ 'order_details' => $order_details ]); return $response; });
这种方式会触发API路由绑定的所有中间件,适合需要完整复用API流程的场景,但相比直接调用业务逻辑会有轻微性能开销。
内容的提问来源于stack exchange,提问作者dokgu
相关产品推荐
相关产品推荐

