需用 php-cs-fixer 作为强制守门人实现 psr-12 规范:先确保 composer.json 正确配置 psr-4 自动加载并执行 dump-autoload,再安装 php-cs-fixer、配置 .php-cs-fixer.php 指定扫描目录,通过 --dry-run 验证后全量修复,最后接入 pre-commit 钩子与 ci 校验。

将 ThinkPHP 5.1 老项目从自由编码风格升级为 PSR-12 自动化规范,需绕过框架自身不校验的限制,用外部工具链接管格式控制权——不能只改编辑器设置,也不能只跑一次 fix 命令,必须让 php-cs-fixer 成为代码落地前的强制守门人。
确认项目基础结构是否满足 PSR-4 加载前提
TP5.1 默认未注册 app/ 目录为 PSR-4 自动加载路径,若类文件命名空间与物理路径不严格匹配,php-cs-fixer 即使修复了格式,后续也会因 Class not found 报错而无法验证效果。先检查 composer.json 是否已声明映射:
打开 composer.json,确认 【"autoload": {"psr-4": {"app\": "app/"}}】 存在且末尾有反斜杠;若缺失,手动添加并保存。
执行 composer dump-autoload -o 生成优化版 autoload_static.php——这步漏掉会导致后续所有格式修复后的代码在运行时找不到类。
安装并配置 PHP-CS-Fixer
TP5.1 不内置代码格式化工具,必须手动引入 PHP-CS-Fixer:
运行 composer require --dev friendsofphp/php-cs-fixer 安装到开发依赖。
在项目根目录创建 .php-cs-fixer.php 配置文件,内容为:
return PhpCsFixerConfig::create()<br> ->setRules([<br> '@PSR12' => true,<br> 'array_syntax' => ['syntax' => 'short'],<br> 'no_unused_imports' => true,<br> 'visibility_required' => true,<br> ])<br> ->setFinder(<br> PhpCsFixerFinder::create()<br> ->in(['app', 'common', 'extend'])<br> ->exclude('vendor')<br> ->name('*.php')<br> );
注意:TP5.1 的 app 目录是核心业务区,common 存放公共函数,extend 是扩展类存放点——这三个目录必须显式写入 in(),否则 fix 命令不会扫描它们。
执行首次全量修复并验证效果
第一步:运行 ./vendor/bin/php-cs-fixer fix --dry-run --diff 查看哪些文件会变、哪里要改,不实际写入。
第二步:确认无误后执行 ./vendor/bin/php-cs-fixer fix ——这会直接覆盖原文件,【操作不可逆,请提前 git commit 或备份】。
第三步:挑出几个典型文件(如 app/controller/Index.php 和 app/model/User.php),用 PhpStorm 打开,按 Ctrl+Alt+L 触发编辑器格式化,对比是否与 php-cs-fixer 输出一致;若不一致,说明 PhpStorm 的 Code Style 没对齐 PSR-12,需进入 Settings → Editor → Code Style → PHP → Set from → PSR-12 → Apply。
接入 Git pre-commit 钩子防止规范回退
方法一:用 husky-like 方式(推荐)
在项目根目录新建 .husky/pre-commit 文件,写入:
#!/bin/sh<br>./vendor/bin/php-cs-fixer fix --verbose
赋予可执行权限:chmod +x .husky/pre-commit。
方法二:纯 shell 钩子(兼容性更强)
进入 .git/hooks/ 目录,新建 pre-commit 文件,内容为:
#!/bin/sh<br>echo "Running PSR-12 fix before commit..."<br>if ! ./vendor/bin/php-cs-fixer fix --dry-run --quiet; then<br> echo "PSR-12 violations found. Fixing..."<br> ./vendor/bin/php-cs-fixer fix<br> git add .<br>fi
同样执行 chmod +x pre-commit。
这一步做完,每次 git commit 前都会自动跑一遍修复,不合规范的代码进不了仓库。
CI 流水线中加入强制校验
在 CI 配置文件(如 .github/workflows/ci.yml 或 .gitlab-ci.yml)中,在 test 步骤前插入:
- name: Check PSR-12 compliance<br> run: ./vendor/bin/php-cs-fixer fix --dry-run --diff
CI 环境中不加 --dry-run 会直接修改文件但不提交,导致构建失败;加了它则只检查,违反即报错中断流程。











