直接运行 composer create-project slim/slim-skeleton myapp 即可创建完整可用的 Slim 4 项目,它已预装 PSR-7 实现(nyholm/psr7 和 nyholm/psr7-server)、路由、DI 容器及基础中间件,避免手动安装 slim/slim 导致的“Call to undefined method AppFactory::create()”等常见错误。

composer install slim4 的最小必要命令
直接运行 composer create-project slim/slim-skeleton myapp 就能拉起一个带路由、DI 容器和基础中间件的 Slim 4 项目。它比手动 composer require slim/slim 更稳妥,因为骨架里已配好 index.php、routes.php 和 PSR-7 实现(用的是 nyholm/psr7 和 nyholm/psr7-server),省得你踩“找不到 Request 对象”这类坑。
常见错误现象:Call to undefined method Slim\Factory\AppFactory::create()——说明你装了 Slim 4 但没装 PSR-7 实现;或者用了旧版教程里的 new Slim\App(),Slim 4 已弃用该写法。
- 别用
composer require slim/slim单独装核心包,它不带 PSR-7 实现,跑不起来 - 如果已有项目要集成,必须同时加:
composer require slim/slim:^4.13 nyholm/psr7:^1.8 nyholm/psr7-server:^2.1 - Slim 4 默认不带 JSON 响应封装,需要自己写
$response->withHeader('Content-Type', 'application/json')
写一个可调用的 GET 接口(带参数解析)
微服务接口最常卡在路径参数和查询参数混用时的取值逻辑。Slim 4 的 $request->getQueryParams() 和 $request->getAttribute('route')->getArguments() 必须分清用途,否则会拿错值。
使用场景:比如 /users/{id}?include=posts,{id} 是路由参数,include 是查询参数。
-
$request->getAttribute('id')可直接取路由参数(前提是 route 定义里写了{id}) -
$request->getQueryParams()['include'] ?? null取查询参数,注意空数组返回是[],不是null - 别用
$request->getParsedBody()读 GET 请求体——它只对 POST/PUT 的application/json或表单有效
示例路由定义:$app->get('/users/{id}', function ($request, $response) { ... });
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
POST JSON 接口怎么正确读 body
很多人写 $request->getParsedBody() 发现返回 null,其实是因为 Slim 4 默认不自动解析 JSON。必须显式注册一个中间件或手动解析,否则 getParsedBody() 永远为空。
性能影响:每次请求都 json_decode(file_get_contents('php://input')) 不推荐,应复用 PSR-7 的 getBody() 流读取一次。
- 先确认请求头有
Content-Type: application/json,否则 Slim 不触发 JSON 解析逻辑 - 推荐做法:在中间件里统一处理(Slim 4 支持
$app->add()),例如:use Psr\Http\Message\ServerRequestInterface as Request;<br>use Psr\Http\Server\RequestHandlerInterface as Handler;<br><br>return function (Request $request, Handler $handler) {<br> $contentType = $request->getHeaderLine('Content-Type');<br> if (str_starts_with($contentType, 'application/json')) {<br> $body = (string) $request->getBody();<br> $data = json_decode($body, true);<br> if (json_last_error() === JSON_ERROR_NONE) {<br> $request = $request->withAttribute('json', $data);<br> }<br> }<br> return $handler->handle($request);<br>}; - 之后在路由里用
$request->getAttribute('json')拿数据,比反复解析更安全
本地开发时 Apache/Nginx 配置容易漏的关键点
本地跑不起来最常见的原因是 Web 服务器没把所有请求转发给 public/index.php,导致路由 404。Slim 本身不处理重写规则,这完全取决于你的服务器配置。
兼容性影响:PHP 内置服务器(php -S)默认不支持重写,必须加路由器脚本;而 Nginx 的 try_files 和 Apache 的 .htaccess 规则稍有不同。
- Apache:确保
.htaccess在public/目录下,且AllowOverride All已启用 - Nginx:必须有
try_files $uri $uri/ /index.php?$query_string;,漏掉$query_string会导致 GET 参数丢失 - PHP 内置服务器:启动命令得带路由器文件,例如
php -S localhost:8000 -t public public/index.php,否则静态资源和路由全挂
复杂点在于,有些 IDE 自带的 PHP Server 不支持传入路由器脚本,这时候只能切到命令行,或者换用 Laravel Valet / DDEV 这类工具——但那已经超出 Slim 本身范畴了。

















