Laravel 与 PHP 应用
为交接而构建的 Laravel 应用。
客户门户、订阅计费、内部工具,以及把它们与您其他系统连接起来的 API。有类型约束,在关键处有测试,文档完备到您可以毫无波折地换掉我——这才是“项目完成”唯一诚实的定义。
01范围我构建什么
通常指的是这几类应用。
客户与合作伙伴门户
客户登录后查看自己数据的地方——订单、发票、文件、用量、权益。难点很少在界面本身,而在于权限模型、审计记录,以及当一个账户需要六个权限各不相同的用户时会发生什么。
订阅与发票计费
套餐、按比例计费、账期、催缴、税费、PDF 发票,以及财务团队真正信得过的对账报表。我基于复式记账账本而不是累计总额来构建计费,因为一旦有人对某笔扣款提出异议,累计总额根本无法审计。
取代电子表格的内部工具
那些目前还活在共享表格里的流程,伴随着版本冲突,以及唯一一个真正搞得懂它的人。把它变成一个应用,往往是企业能委托的回报最高的工作,通常也是规模最小的。
API 与集成
为您自己的前端、移动应用或合作伙伴提供 REST 或 GraphQL 接口。再加上把 Laravel 与您其他系统连接起来的集成工作——ERP、CRM、支付服务商、仓储系统。
接手别人的代码库
这类项目我会先花一周只读不改:如果有测试就先跑测试,梳理领域模型,并把发现写下来——包括让我担心的部分。无论您是否继续合作,这份评估都归您所有,所以您永远不会只为了听一句“代码没问题”而付钱。
02方法钱花在哪里
我把您的预算花在哪里。
大多数应用预算都损耗在同样的三个地方,所以精力要投入到那里,而不是那些演示时好看的部分。
数据模型,放在最前面
数据库结构的决定是没法廉价撤回的。上线十八个月后把一张表拆成三张,同时还有真实的客户数据和一整套报表依赖着它——这是一个项目生命中最昂贵的一天。我宁可在表结构上多花两天,也不愿在那次迁移上多花两周。
一切涉及金钱或权限的部分
计费、角色,以及任何写入账本的逻辑都要有测试。不是为了覆盖率徽章,而是为了让下一个人能修改您的定价逻辑,而不会悄悄搞坏上个季度的发票。其他地方我只测试棘手的路径,显而易见的就不去碰。
当别的系统出故障时会怎样
集成不是能跑通就算完成,而是在对方系统超时的时候依然表现得合理才算完成。这意味着队列任务、有上限的重试、幂等键,以及人能读懂的失败日志——这样供应商某个下午出了问题,只会延迟您的数据,而不会让数据丢失。
这些都不稀奇。这就是普通而细致的 Laravel。它带来的差别会在第二年显现——恰恰是大多数代理公司已经离开、您才发现自己到底买到了什么的时候。
03交接最后归您所有的东西
交付物不只是一个跑起来的应用。
- 01
代码仓库
- 从第一次提交开始就放在您的组织里,而不是我的。历史完整,提交信息写明为什么,而不只是写了什么。
- 02
架构文档
- 几页篇幅,涵盖领域模型、我做出的决定,以及我否决了哪些方案、为什么。这份文档能为您的下一位开发者省下两周时间。
- 03
可运行的本地环境
- 新开发者应在一小时内从克隆仓库到运行起应用,种子数据要能生成贴近真实的数据。如果这要花一天,项目就还没完成。
- 04
部署与回滚说明
- 如何部署、有哪些环境变量、备份存到哪里,以及如何在凌晨两点回滚而不用给我打电话。
04常见问题常被问到,坦率回答
大家在雇用我之前常问的问题。
这应该做成 Laravel 应用,还是 WordPress 网站?
如果主要工作是发布由非技术人员编辑的页面,WordPress 通常更便宜、更快。如果主要工作是让用户登录后做些什么——下单、预约、审批、出报表——那就是一个应用。硬把应用塞进 WordPress,两年下来的成本通常比一次性把它好好做出来更高。
您能接手现有的代码库吗?
能,而且这是我工作中相当大的一部分。一开始会花一周只读不改,产出一份书面评估:现状如何、风险在哪、我会先做什么。无论您之后怎么决定,这份文档都归您所有。
您写测试吗?
凡是涉及金钱、权限或数据完整性的部分,都写。我不追求覆盖率数字——一套全是“getter 会返回值”的测试,只是伪装成质量的维护成本。测试的存在,是为了让别人改您的计费逻辑时不会把它改坏。
部署和主机怎么处理?
沿用您已有的——VPS、Forge、Ploi、Vapor、容器都可以。如果还什么都没有,我会推荐符合您流量的最简单方案。对大多数业务应用来说,那就是一台配置得当、带托管数据库备份的服务器,而不是集群。
能对接我们的 ERP 或 CRM 吗?
通常可以。真正的问题从来不是能不能做,而是当对方系统变慢或宕机时它会怎样表现。带有上限重试的队列任务,加上一份可读的失败日志,让对方的故障只会延迟您的数据,而不会让数据丢失。
上线后如果需要修改怎么办?
代码仓库和文档都归您所有,所以您可以雇用任何人。如果您更愿意继续找我,我提供按月的工时套餐。我想避免的是在结构上变得不可替代——一个只有我能维护的应用,对您是风险,而不是我的护城河。