从零搭建 Symfony 项目须严格遵循环境准备、Flex 初始化、DATABASE_URL 规范配置、Doctrine 迁移建表及 symfony server 启动五步;跳过 Flex、手写配置、误配 .env 是三大典型错误。

从零开始搭一个 Symfony 项目,关键不是“装完就行”,而是每一步都踩在正确路径上:环境要稳、命令要准、配置要严。跳过 Flex、手写配置、乱改 .env 格式,是新手最常掉的三个坑。
环境准备:PHP + Composer + CLI 三件套必须到位
别急着敲命令,先确认基础链路通:
- 运行
php -v,确保 PHP ≥ 8.2(Symfony 官方推荐,7.4 已停止维护);必须启用mbstring、xml、zip、pdo_sqlite和intl扩展(缺intl会导致 Twig 或日期格式报错) - 运行
composer -v,确认 Composer 可用;国内用户建议提前设镜像:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - Symfony CLI 不是必须,但强烈推荐装——macOS 用
brew install symfony-cli/tap/symfony-cli,Linux/Windows 见官网。它能自动处理证书、热重载和本地 HTTPS,比php -S稳得多
创建项目:只用一条命令,且必须带 Flex
进终端,执行这一条:
composer create-project symfony/website-skeleton myapp
立即学习“PHP免费学习笔记(深入)”;
注意:别用 skeleton(太轻量,缺 Twig/Doctrine 默认配置),也别手动 mkdir + composer init——那样不会触发 Flex recipe,config/packages/ 下空空如也,src/Controller/ 不自动生成,后续全靠猜配置。
创建完立刻验证 Flex 是否生效:
cd myapp && php bin/console about → 输出里要有 Flex: enabled
再检查 .env 文件开头两行是否为:
APP_ENV=dev<br>APP_DEBUG=1
数据库连接:DATABASE_URL 是唯一入口,其他全是配角
打开 .env,找到并修改这行(删掉原有 DATABASE_URL):
DATABASE_URL="mysql://app_user:my%40pass@127.0.0.1:3306/myapp?serverVersion=8.0&charset=utf8mb4"
重点细节不能错:
- 协议头必须是
mysql://(不是mysql:或漏掉//) - 地址写
127.0.0.1,别写localhost(否则可能走 Unix socket,报No such file or directory) -
serverVersion必须显式声明,MySQL 8.0 写?serverVersion=8.0,5.7 就写5.7;缺了会导致 JSON 字段、CTE 查询等语法不识别 - 密码含
@、/、:要 URL 编码,例如pass@word→pass%40word - 务必加上
&charset=utf8mb4,否则 emoji 和部分中文会存成问号
然后执行:
php bin/console doctrine:database:create
如果报 Access denied,90% 是 MySQL 用户权限不足,不是 URL 写错了。进 MySQL 执行:
CREATE USER 'app_user'@'%' IDENTIFIED BY 'my%40pass';<br>GRANT CREATE, SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'%';<br>FLUSH PRIVILEGES;
建表与验证:用迁移,别碰 schema:update
生成一个实体试试:
php bin/console make:entity Product
按提示加字段,比如 name:string(255)、price:float
生成迁移文件:
php bin/console make:migration
执行迁移(这才是安全建表方式):
php bin/console doctrine:migrations:migrate
⚠️ 切记不要用 doctrine:schema:update --force:它不记录历史,线上升级会丢数据;MySQL 8.0.23+ 还会因 ALGORITHM 限制直接失败。
最后启动服务:
symfony server:start(推荐)
或 php -S 127.0.0.1:8000 -t public(确保指定 -t public)
浏览器打开 https://www.php.cn/link/f0838b2ebfc6440a474eabdc326bf31a,看到 Symfony 欢迎页,且能执行 php bin/console doctrine:query:sql "SELECT 1" 返回结果,就说明整条链路跑通了。



















