Overview
With Dependencies, you can replace parts of Spree core with your custom code: Services and Workflows, CanCanCan Abilities (used for Permissions), and API Serializers (used for generating JSON API responses).Application (global) customization
This will change every aspect of the application (both APIs, Admin Panel, and Storefront). In yourconfig/initializers/spree.rb file, you can set the following:
super keeps Spree’s behaviour and adds yours around it,
which is usually what you want — a full rewrite means re-implementing logic that
changes between releases.
Replacing a workflow
Workflow-backed seams end in_workflow (cart_add_item_workflow,
carts_complete_workflow, payment_capture_workflow, …). A replacement
subclasses the workflow and overrides perform:
Before writing this, check whether a
hook covers your case —
carts.add_item.validate and carts.add_item.after_item_added handle most
reasons people replace this class, and they don’t need maintaining across
upgrades.Using dependencies in your code
When you need to use a dependency in your code, you can access it directly via theSpree module:
Controller level customization
If you need to replace serializers or Services in a specific API endpoint you can create a code decorator:MyNewAwesomeCartSerializer and also it will swap the default add_item_service to MyNewAwesomeAddItemToCart.
Different API endpoints can have different dependency injection points. You can review their source code to see what you can replace.
API level customization
Storefront API and Platform API have separate Dependencies injection points so you can easily customize one without touching the other. In your Spree initializer (config/initializers/spree.rb) please add:
AnotherAddItemToCart and the rest of the application will use MyNewAwesomeAddItemToCart.
Debugging dependencies
Spree provides rake tasks to help you debug and inspect dependencies:List all dependencies
grep to filter results:
Show only overridden dependencies
Validate all dependencies
Programmatic introspection
You can also inspect dependencies programmatically:Renamed seams in Spree 6.0
Seams backed by a workflow were renamed from*_service to *_workflow in 6.0:
Backwards compatibility
The legacy string-based syntax is still supported for backwards compatibility:Default values
Default values can be easily checked by:- Using the rake task:
bin/rake spree:dependencies:list - Looking at the source code:

