唯一正解是用composer create-project拉取官方骨架,因其提供完整目录结构和预设配置;手动require或全局安装会导致缺失src/、bin/console等关键文件,引发Kernel未找到等错误。

直接用 composer create-project 创建项目,不是“安装框架”,而是拉取一个预配置好的完整骨架;手动 composer require symfony/framework-bundle 或全局装 symfony/symfony 会导致结构缺失、Class not found: App\Kernel 等问题,已不适用。
为什么不能用 composer require 安装 Symfony 框架
因为 symfony/framework-bundle 只是组件,不是可运行项目:它不带 src/、public/index.php、bin/console、.env 或自动加载规则。你得到的是一个“空壳依赖”,不是应用。
-
composer require symfony/framework-bundle后执行php public/index.php必报Warning: require(vendor/autoload.php): failed to open stream—— 因为public/根本不存在 -
composer global require symfony/symfony已废弃(Packagist 标为abandoned),装完只有空目录,无任何启动入口 - 即使硬凑出
Kernel和index.php,也会缺 Flex recipes,导致cache:clear报错Unable to write in the cache directory或路由不生效
create-project 的骨架选型与版本锁定
不同骨架决定项目起点和后续扩展成本:symfony/skeleton 是最小 API 启动模板,symfony/website-skeleton 预装 Twig、WebProfiler、AssetMapper 和基础构建支持。
- 纯 API / 微服务:用
composer create-project symfony/skeleton:^6.4 myapi(PHP ≥ 8.1) - 传统 Web 应用:用
composer create-project symfony/website-skeleton:^6.4 myweb - 目标目录(如
myapi)必须不存在,否则命令直接失败 —— 它不覆盖,也不提示 - 加
--no-interaction --prefer-dist可跳过交互、强制用压缩包,适合 CI 或网络不稳定环境
安装后必须立即执行的三步初始化
很多人跑完 create-project 就开浏览器,结果 500 或白屏 —— 缺少这三步,项目只是“半成品”。
- 进目录手动跑一次
composer install:虽然create-project默认会触发,但网络中断或缓存异常时可能静默失败;这步确保 Flex recipe 正确注入config/packages/并完成assets:install - 检查
.env中APP_ENV=dev是否生效(别留着prod还没清缓存) - 首次运行前必须
php bin/console cache:clear:否则var/cache目录权限不对(尤其 WSL/Docker 下必报Unable to write in the cache directory)
底层组件按需安装与稳定性控制
如果你只是想在非 Symfony 项目里用某个功能(比如命令行或 HTTP 抽象),才用 composer require 装单个组件;此时无需骨架,但要注意版本与 PHP 匹配。
- 装组件示例:
composer require symfony/console:^6.4、composer require symfony/http-foundation:^6.4 - UX 类组件(如
symfony/ux-turbo)默认无稳定版,得显式指定分支:composer require symfony/ux-turbo:dev-main - 绝不能把
composer.json里的"type"改成"library"—— 这会让bin/console找不到App\Kernel,因 Symfony 自动加载依赖"project"类型 - PHP 版本不匹配时,Composer 不会明确报错,而是卡在
Your requirements could not be resolved—— 先确认php -v是否 ≥ 8.1(6.x)或 ≥ 8.2(7.x)
最容易被忽略的是:create-project 只复制骨架,vendor/ 依赖是否真装上,得靠 composer install 实锤;而 cache:clear 不仅清缓存,更是修复 var/cache 权限的关键动作,尤其跨平台开发时,这一步漏了就等于没装完。



















