用途:为 Spree 6 定制提供“代码该放哪”的决策路径,避免 fork。按表格自上而下选择:越靠上越是数据/配置,成本低且升级不受影响;越靠下越耦合内部实现。
主要能力与用法:
- 商店设置(货币、市场、语言、配送、税率、支付、订单编号)走后台 Settings 或 Admin API,属数据无需部署。
- 全局限制用 SPREE_* 环境变量(启动时类型校验),Spree.config 仍可用于 config/initializers/spree.rb。
- 模型级设置用 preference;拦截操作用工作流 validate 钩子(Spree.hooks.register,handler 调 workflow.reject!);在核心流程内运行代码用生命周期/上下文钩子。
- 事后反应用事件订阅者(Spree::Subscriber,如 order.placed);通知外部系统用 Webhook。
- 结账前置要求用 Spree::Checkout::Registry.add_requirement / register_step。
- 替换税务、配送、履约、搜索、定价、库存、支付等用 Provider 注册。
- 自有 IdP 登录用认证策略;商户数据用自定义字段;集成数据用 metadata;可筛选属性用 Spree.ransack.add_attribute。
- 新增模型/端点用 spree generate api_resource;新增状态用 Spree::HasStatus;改变核心流程用依赖替换(Spree::Dependencies.*_workflow)。
- 装饰器为最后手段;后台界面用 dashboard 插件;跨应用共享用扩展 gem。
限制与反模式:不要用装饰器覆盖 finalize!、cancel 等生命周期方法,改用钩子;不要用 after_save/after_commit 做副作用,改用事件订阅者;不要 clear_validators!;additional_permitted_attributes 必须用 +=(默认冻结);不要写旧版 *_service 依赖键;不要直接设 payment_status/fulfillment_status;新状态字段不要用枚举或状态机;后台不要改 Rails 视图。命令在经典 Rails 应用用 bin/rails 并去掉 server/ 前缀。更多文档见 node_modules/@spree/docs/dist/developer/customization/quickstart.md 及 https://spreecommerce.org/docs/developer/customization/quickstart。