必须完成路由注册与中间件注入两个核心动作,否则请求会404或绕过安全校验;需先创建app实例,再定义带正则约束的restful路由,最后在路由前注入日志与错误处理中间件并调用run()。

要在生产环境或本地快速跑起一个可路由、带权限控制的Slim微服务,必须完成路由注册与中间件注入两个核心动作,缺一不可,否则请求会直接404或绕过安全校验。
创建基础应用实例
在public/index.php顶部引入自动加载器并初始化App对象,这是所有后续配置的起点:
require __DIR__ . '/../vendor/autoload.php';
use Slim\Factory\AppFactory;
$app = AppFactory::create();
这一步不能跳过,【没有App实例就无法调用get()、add()等任何方法】,后续所有路由和中间件都依附于它。
定义带参数的RESTful路由
使用标准HTTP动词方法注册接口路径,动态参数用花括号包裹:
$app->get('/api/users/{id:[0-9]+}', function ($request, $response, $args) {
$id = $args['id'];
return $response->withJson(['id' => $id, 'name' => 'Alice']);
});
注意正则约束[0-9]+——它强制{id}只能是数字,避免恶意字符串触发数据库查询异常。不加约束时,/api/users/abc也会匹配成功,但可能引发类型错误。
$app->post('/api/posts', function ($request, $response) {
$body = $request->getParsedBody();
return $response->withStatus(201)->withJson(['success' => true]);
});
注入全局日志中间件
中间件必须在路由定义前注册,否则不会生效:
方法一:匿名函数写法(适合调试)
$app->add(function ($request, $response, $next) {
error_log('[' . date('Y-m-d H:i:s') . '] ' . $request->getMethod() . ' ' . $request->getUri()->getPath());
$response = $next($request, $response);
return $response;
});
方法二:类封装写法(推荐用于生产)
class AccessLogMiddleware {
public function __invoke($request, $response, $next) {
$start = microtime(true);
$response = $next($request, $response);
$duration = round((microtime(true) - $start) * 1000);
file_put_contents(__DIR__.'/../logs/access.log',
sprintf("%s %s %dms\n", $request->getMethod(), $request->getUri()->getPath(), $duration),
FILE_APPEND);
return $response;
}
}
$app->add(new AccessLogMiddleware());
启用错误处理中间件
第一步:启用内置错误中间件
$app->addErrorMiddleware(true, true, true);
第二步:自定义错误响应格式(覆盖默认HTML)
$app->add(function ($request, $response, $next) {
try {
return $next($request, $response);
} catch (\Exception $e) {
return $response->withStatus(500)->withJson(['error' => 'Internal Server Error']);
}
});
第三步:确保public/index.php末尾执行run()
$app->run();











