当 AI 开始写 PHP:一个“没有魔法”的框架,如何消灭 Vibe Coding 里的幻觉

简介: 阿杰用「标准全家桶」让 AI 写下单接口,却被框架层层「魔法」绕晕。老陈甩来一个没有魔法的 PHP 框架——三行代码一次跑通,彻底告别手写样板。为什么 AI 在这里不再幻觉?

作者:姚杨 | 专栏:阿杰的技术成长

周五深夜,vibe coder 阿杰用「标准全家桶」让 AI 写下单接口,却被框架层层「魔法」绕晕,整晚调试无果。务实 CTO 老陈看不下去,甩来一个「没有魔法」的框架链接。阿杰半信半疑换上,没想到三行代码一次跑通——路由、响应、落库一气呵成,彻底告别手写样板。他正琢磨「正式立项改名会不会很麻烦」,老陈神秘一笑:「一条命令的事。」到底这条命令做了什么,能让模板瞬间变成你自己的项目?

周五晚 11 点,阿杰又卡住了

阿杰是个典型的「vibe coder」——他不直接写代码,他对着 AI 说人话。微信刚弹来产品消息:「周一前给运营做个内部下单工具,能查订单、能建订单就行。」阿杰心想这有何难,打开他最熟的 PHP 全家桶就开干。

那是套「业界标准」配置:服务容器、门面(Facade)、注解路由、依赖注入。AI 帮他生成了一段控制器,看起来人模狗样:

// AI 生成的「标准」控制器
public function store(Request $request)
{
   
    $user = Auth::user();                    // Facade 静态代理,背后是容器绑定
    $order = Order::create($request->validated()); // 依赖一个 FormRequest 类
    $order->save();
    return response()->json($order);          // 又包了一层响应封装
}

一跑就报错。Auth 门面背后那层静态代理 AI 没搞对,容器里没绑定这个服务;validated() 需要的 FormRequest 类压根没生成。阿杰在三个文件之间来回跳,AI 每改一次就引入一个新的「魔法」漏洞。凌晨两点,他终于承认:问题不在 AI,在于框架给 AI 挖了太多坑。

老陈甩来一个链接:「试试这个,没有魔法」

做 CTO 的老同学老陈,一句话点醒他:「你先别想什么 Service、Repository。就写个闭包。」

老陈发来的项目叫 php-vibe-coding-frame——一个单层 MVC 的极简 PHP 框架,专为 PHP-FPM 快速开发设计。没有 DI 容器、没有注解、没有 YAML 路由配置、没有 Composer autoload;路由即闭包,控制器即函数,写完即跑。

阿杰半信半疑 clone 下来,按文档跑了一条命令,浏览器里跳出了 hello world

git clone https://github.com/smarty-kiki/php-vibe-coding-frame.git my-project
cd my-project
sh project/tool/start_development_server.sh # Docker 一键起开发环境

clone 下来,阿杰顺嘴问了一句:「目录还叫 php-vibe-coding-frame,正式立项改名不麻烦?」老陈乐了:「一条命令的事。」他指了指 project/tool/naming_project.sh

sh project/tool/naming_project.sh my-project

「它会把 nginx、supervisor、Caddy 的配置文件名,连同 README、CLAUDE.md 里所有项目名占位符,一次性替换成 my-project。模板秒变你的项目,连文档都帮你改好——基于这套模板初始化新项目,基本零摩擦。」

三行代码,第一次跑就通了

老陈说:「你那个下单需求,我就写个闭包。」阿杰照着写:

if_post('/order', function () {
   
    $order = order::create(input('user_id'), input('amount'));
    return $order; // 返回实体 → 自动 JSON;闭包结束 → 自动落库
});

他盯着屏幕:没有 ->save(),没有 response()->json(),没有注入。 闭包返回实体,框架自动序列化成 JSON;闭包一结束,unit_of_work() 自动把新订单 INSERT 进库。第一次跑,就成了。

阿杰愣了一下——他花了一整晚在「标准框架」里和魔法搏斗,在这个框架里,三行代码解决了。

为什么 AI 在这里不再「幻觉」

老陈在语音里笑:「这框架的核心哲学就一句话——框架退后一步,让意图站到前面。 它对 AI 友好,是因为它对人友好。」

他点了几个设计:

  • 没有魔法:没有 __call 代理、没有 Facade 静态代理、没有注解解析。Ctrl+Click 能追到源码,grep 能找到所有引用。AI 的静态分析不会被元编程绕晕。
  • 意图即结果:闭包返回数组就是 JSON,返回字符串就是 HTML。AI 看一眼就知道输出是什么,不用猜 response()->json() 的封装。
  • 一个文件就是一个功能:路由、参数校验、业务调用全在一个闭包里。改一个功能,改一个文件。AI 不用在 Controller → Service → Repository 的调用链里迷路。
  • 自动持久化unit_of_work() 自动包裹所有路由闭包。你只管 create、赋属性,闭包结束自动写库,不用记 save()/flush() 的时机。

「过去十年我们攒了一堆『为了人类可维护性』的模式,」老陈说,「接口隔离、依赖反转、DI 容器——前提是项目大到人类必须切块。但 AI 能在单个文件里理解全部逻辑,这些中间层对它来说就是噪音。分层越多,AI 幻觉的注入点越多。 这个框架主动做了减法:这不是阉割,是剪枝。」

阿杰后来拿它干了三件事

  1. 运营下单工具(就是那个周五的需求)——一个下午交付,周一正常用。
  2. 小程序后端 API 服务——毫秒级延迟,不用路由/配置缓存预热,PHP-FPM 原生友好。
  3. 快速验证业务想法——想法到代码的路径最短,写完即跑。

它最适合:中小型项目、快速原型、API 服务、内部工具。它不适合需要完整组件系统、复杂事件总线的超大型应用——那种场景,上 Laravel 更合适。框架不替你做架构决策,它只是把摩擦降到最低。

和「标准框架」的对照

维度 php-vibe-coding-frame Laravel
路由 闭包直接写在 controller/*.php routes/web.php 指向 Controller 类方法
控制器 闭包即控制器 Controller 类 + 方法
DI 无,依赖显式 include 服务容器自动注入
ORM 自研 ActiveRecord + 工作单元 Eloquent
配置 PHP 数组 + 环境覆盖 .env + config/*.php
类加载 class map,O(1) include Composer PSR-4
启动开销 仅 include ~10 个核心文件 数百类 + 数十 ServiceProvider
AI 友好度 高(无魔法,静态可追溯) 中(魔法层易致幻觉)

尾声:早知道,昨晚能多睡四小时

周一早上,阿杰把下单工具交给运营,顺手给老陈发了句:「早知道有这框架,昨晚能多睡四小时。」老陈回:「框架不背锅,选对工具才省时间。去 Star 一下,下次别再跟魔法较劲了。」

如果你也在用 AI 写 PHP,却总被框架的「魔法」绕晕,不妨试试这个把意图放在第一位的框架:

git clone https://github.com/smarty-kiki/php-vibe-coding-frame.git
cd php-vibe-coding-frame
sh project/tool/start_development_server.sh # 打开 http://localhost 看 hello world

项目完全开源,仓库地址:

https://github.com/smarty-kiki/php-vibe-coding-frame

欢迎 Clone、Star,也欢迎来提 Issue 和 PR——一起把「让 AI 一次跑通」这件事,做得更彻底。

目录
相关文章
人工智能 缓存 前端开发
11588 56
人工智能 JavaScript 开发工具
4577 17
开发工具 Swift git
1847 5
Web App开发 人工智能 API
1076 1
人工智能 Java BI
1211 1
人工智能 JavaScript 测试技术
2031 2
人工智能 JavaScript 测试技术
1030 4
缓存 JavaScript Shell
2027 3

热门文章

最新文章