最稳妥方式是运行 composer create-project slim/slim-skeleton myapp,它预装 nyholm/psr7 和 nyholm/psr7-server,配好路由、DI 容器及 index.php,避免因缺失 PSR-7 导致 AppFactory::create() 报错。

直接用 composer create-project slim/slim-skeleton 创建项目最稳妥
手动运行 composer require slim/slim 极易失败,不是版本问题,而是 Slim 4+ 核心包本身不带 PSR-7 实现——没 Request 和 Response 对象,AppFactory::create() 会直接报错。
官方骨架项目已预装 nyholm/psr7 和 nyholm/psr7-server,并配好 index.php、路由加载逻辑和 DI 容器初始化,省掉手动调顺序的麻烦。
-
composer create-project slim/slim-skeleton myapp一步到位,生成可立即php -S localhost:8000 -t public启动的结构 - 生成的
public/index.php已正确调用AppFactory::create(),且自动注入 PSR-7 实例 - 若已有项目想集成,必须同时加三包:
composer require slim/slim:^4.13 nyholm/psr7:^1.8 nyholm/psr7-server:^2.1
composer install 在 Slim 项目里只用于还原依赖,不是安装框架本身
composer install 的作用是读取当前目录下的 composer.lock,精确安装已锁定的依赖版本。它不负责“选版本”或“解决兼容性”,只做还原。
如果你刚初始化项目但还没生成 composer.lock(比如只写了 composer.json 但没跑过 composer install 或 composer update),那 composer install 会失败并提示 “No composer.lock file present.”
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 新项目首次使用,应先运行
composer update生成composer.lock,再用composer install - 团队协作时,务必提交
composer.lock,否则每人composer install可能装出不同 minor 版本,引发nyholm/psr7接口变更类错误 - 不要在生产环境执行
composer update;composer install --no-dev --optimize-autoloader才是上线标准命令
常见报错 Call to undefined method Slim\Factory\AppFactory::create() 怎么修
这个错误几乎 100% 是 PSR-7 实现缺失或版本错配导致的,跟 Slim 本身无关。
Slim 4.11+ 要求 nyholm/psr7 ≥ v1.5,而旧教程常写 slim/psr7(已废弃)或漏装 nyholm/psr7-server(缺 ServerRequestFactory)。
- 检查已安装包:
composer show nyholm/psr7 nyholm/psr7-server,确认两者都存在且版本匹配 - 如果装了
slim/psr7,先composer remove slim/psr7,再装nyholm/psr7和nyholm/psr7-server -
AppFactory::create()必须在nyholm/psr7加载之后调用;若手动 require autoload.php 顺序错,也会触发此错
Slim 4 默认不提供 JSON 响应快捷方法,得自己封装
很多人以为 $response->withJson() 是 Slim 自带的,其实不是——这是 slim/psr7(旧版)或第三方中间件提供的,Slim 4 核心完全不处理内容类型。
你必须显式设置头信息,否则浏览器收到的是 text/html,JSON 字符串会被当 HTML 渲染。
- 正确写法:
$response->withHeader('Content-Type', 'application/json')->getBody()->write(json_encode($data)) - 推荐封装成辅助函数,比如
jsonResponse($response, $data, $status = 200),避免每处重复写头 - 别依赖
slim/psr7,它已归档;nyholm/psr7不提供withJson(),这是设计使然

















