The fourth beta of the 1.5 cycle is now available. This release rounds out a number of new capabilities across discounts, shipping, and tax-zone handling, and ships a broad pass of fixes contributed by the community.Documentation Index
Fetch the complete documentation index at: https://docs.lunarphp.com/llms.txt
Use this file to discover all available pages before exploring further.
New capabilities
Cart-level tax zones
Thecarts table now carries an optional tax_zone_id. Setting it through Cart::setTaxZone() lets line totals be calculated tax-inclusive before a shipping address is captured, which is helpful when the customer’s region is already known from middleware. The Price model’s priceIncTax, priceExTax, and comparePriceIncTax methods also accept an optional TaxZone so product display prices can be calculated for an arbitrary zone. See Carts → Setting the Tax Zone and Pricing → Tax helper methods.
Configurable postcode resolvers
Postcode formats vary by country, so the table-rate shipping add-on now resolves postcodes through registerable resolvers implementingLunar\Shipping\Interfaces\PostcodeResolverInterface. The default UK-style resolver remains in place, and country-specific resolvers can be added through the Postcode facade. See Postcode Resolvers.
Collection rewards in BuyXGetY discounts
BuyXGetY discounts can now use collections as the reward, in addition to products and variants. Collection conditions and rewards are wired through the same discount->collections() relationship and can be combined freely with product or variant discountables. See BuyXGetY.
File attribute disk and directory
The File field type accepts newdisk and directory configuration values, letting file attributes write to a configured filesystem disk and subdirectory.
Extending relation-style admin pages
RelationPageExtension now exposes an extendTable hook for relation-style pages such as ManageProductVariants, ManageCollectionProducts, and ManageVariantMedia. Columns, actions, filters, and query modifiers can be applied without replacing the page class. See RelationPageExtension.
Fixes and hardening
A wide round of fixes lands in this beta:- Editing tier or customer-group prices in the admin no longer triggers a
Pricecast error. - File attribute uploads are persisted correctly after save.
- Stripe phantom payment bugs and zero-decimal currency conversions are fixed.
ProductVariantcasts the realshippableattribute (the cast previously referenced an unusedrequires_shippingkey).- Customer deletion now respects the configured foreign key constraints.
- Attribute handle uniqueness is scoped by
attribute_type, allowing the same handle on different attribute types. - The standalone
CouponValidatorenforcesmax_uses_per_user. - Products keep their navigation visibility when single-variant variants are deleted.
- Soft-deleted purchasables are handled gracefully in cart lines.
- The cart shipping breakdown is reset on every calculate, preventing stale entries.
- Discount stop flags are now honored mid-apply loop.
- Brand deletion nulls the
brand_idon related products instead of cascading. - Tag values are normalized through a model mutator on save.
- Telemetry rate-limiting is defensive against missing cache stores and HTTP failures.
- Search indexers load related models more efficiently.
- Weight-based shipping rate breakpoints evaluate correctly across band boundaries.
- A composite unique index has been added to
product_product_option. - Payment types validate amounts before transacting.
New locales
- Croatian (
hr) - Mongolian (
mn)
Upgrading
tax_zone_id to the carts table. No additional manual steps are required when upgrading from 1.5.0-beta.3.
If upgrading from 1.4 or earlier, follow the 1.5 section of the upgrade guide in full.
View the full release on GitHub.