Shopware Knowledge Patch
Use this patch
Load this patch for Shopware Core, plugin, app, Storefront, Administration, Store API, Admin API, deployment, or upgrade work. Open the reference that matches the affected subsystem before changing extension points, templates, configuration, API payloads, or infrastructure.
Reference index
| Reference | Topics |
|---|---|
| platform-operations.md | Runtime and dependency requirements, builds, scheduled work, queues, cache invalidation, search infrastructure, filesystems, and hosting |
| core-dal-and-extensions.md | DAL validation and queries, write events, entity definitions, custom fields, migrations, exceptions, scripts, and Core extension signatures |
| apis-and-integrations.md | Store API and Admin API contracts, authentication, permissions, OAuth, MCP, OpenAPI, apps, and measurement systems |
| administration.md | Administration cache hooks, Rule Builder, CMS blocks, snippets, Vue, Vite, Pinia, Meteor components, notifications, and dashboard extensions |
| storefront-and-twig.md | Routing, navigation, ESI pagelets, cache hashes, forms, snippets, breadcrumbs, URLs, CMS rendering, themes, accessibility, and Twig |
| commerce-orders-and-payments.md | Orders, customers, addresses, cart rules, pricing, payment and shipping migrations, tax providers, documents, PDF, and ZUGFeRD |
| media-search-and-content.md | Thumbnail processing, media paths, product streams, SEO resolution, and mail simulation |
Breaking changes and removals
Platform and build compatibility
- Account for Doctrine DBAL 4, PHPUnit 11, Dompdf 3, and league/oauth2-server 9 when directly consuming those dependencies.
- Administration extensions with
webpack.config.jsmust migrate tovite.config.js, ship a 6.7-specific build, and run on native Vue 3. - Browser support follows Browserslist
defaultsunlessBROWSERSLISToverrides it; nativeURLSearchParamsreplacesquery-string. - Declare
doctrine/inflector,symfony/monolog-bridge, andsymfony/proxy-manager-bridgedirectly when an extension uses them.
Store API and authentication
- Stop consuming
orders.elements[].lineItems[].payload.purchasePrices; Store API serialization removes it with no Store API replacement. - Send OAuth scopes in singular
scopeas a space-delimited string. Array-valuedscopesis rejected, and the authorization endpoint and controller were removed without replacement. - Remove
MCP_SERVER; MCP endpoints are available wheneversymfony/mcp-bundleis installed, with no supported disabling flag. - Replace removed
Cached*Routedecorators. Storefront header and footer now render through their ESI routes and layout entry points. - Store API registration and login event customer entities no longer preload associations; subscribers must query related data explicitly.
Payments and orders
- Payment and shipping writes and installers must provide stable
technicalNamevalues; replace migration-createdtemporary_<method-id>placeholders. - Extend
AbstractPaymentHandlerrather than the deprecated payment-handler interfaces. Declare refund or recurring support throughsupports(). - App payments use
manifest-3.0.xsdandpay-url; asynchronous calls do not set payment states automatically, and finalize query parameters are inrequestData. - Replace customer default-payment usage with the last-used/current method.
Migrated rules use
paymentMethod, and the changed-payment-method flow is disabled. - Use
order.primaryOrderDeliveryandorder.primaryOrderTransactionrather than positional collection access.
DAL and Core extensions
- Replace plugin
Resources/config/entities.xmlcustom entities withEntityDefinitionor attribute entities. Declare many-to-many foreign-key fields and implementEntityExtension::getEntityName(). - Do not subclass DAL attribute classes,
IsFlowEventAware, orRuleComparison; their inheritance contracts are closed. - Use the moved DAL
UnmappedFieldException. When both 6.7 feature-flag states must work, catch both classes because they share no exception parent. - Replace removed Core APIs with
CreateMigrationCommand,MigrationQueryGenerator, andAccountService::loginByCredentials()orloginById()where applicable. - Move cache-state constants to
CacheStateSubscriber, and cache-cookie and invalidation-header constants toHttpCacheKeyGenerator. - Use
SystemConfigExceptionfactory methods. The former system-config exception classes are replaced, whiletrace()andgetTrace()are deprecated no-ops.
Storefront extension points
- Replace route-state variables and
.is-ctl-*/.is-act-*selectors withactiveRoute,window.activeRoute, and.is-active-route-*. - Use
addressTypeinstead of the deprecated address-manager Twig variabletype. - Pass
SalesChannelContexttosw_breadcrumb_fullandsw_breadcrumb_full_by_id. - Replace
CookieProviderInterfacedecorators withCookieGroupCollectEventlisteners; cookie Twig fields usenameanddescription. - Resolve theme files through
ThemeFilesystemResolver; the old theme file importer types andStorefrontController::setTwig()are removed. - Move header/footer data extensions to
HeaderPageletLoaderorFooterPageletLoaderand their loaded events. - Update product-card, selector, line-item, pagination, and icon markup for the current accessibility contracts.
Administration extension points
- Register core-compatible state with
Shopware.Store.register()and mutate it through actions. Remaining Vuex code uses themapVuex*helpers. - Migrate the listed basic
sw-*components to theirmt-*counterparts; account formodel-value, checked-value exceptions, renamed variants, and explicit icon sizes. - Move generic rule conditions to
sw-condition-genericand centralrule_conditionerrors instead of local condition-error mappings. - Move CMS entity-select overrides to the component-specific blocks listed in the Administration reference.
- Move notification types from
Shopware\AdministrationtoShopware\Core\Framework\Notification.
Infrastructure and configuration
- Varnish cache tags require XKeys and can no longer be stored in Redis.
Replace Redis
dsn/urlsettings with namedconnectionsettings. - JWT signing uses only
APP_SECRET, which must be at least 32 characters; custom RSA secrets and the JWT-secret generation command are removed. - Declare filesystem
visibilitybesidetype, not within adapterconfig. - Run
bin/console es:indexafter the Storefront Elasticsearch mapping changes. - For OpenSearch 3, omit an empty mapping
propertiesmember or represent it as{}, never[].
High-value current features
DAL and extension authoring
- Use
Criteria::excludeFields()to omit eligible storage columns while retaining normal typed entities. Do not combine it withaddFields(). - Put app or plugin custom-field definitions in
Resources/config/custom-fields.xml; lifecycle operations synchronize the fields, andinclude-in-searchenables product-search indexing. - Use
dal:validate --tolerate-foreign-key=constraint_nameonly to tolerate a named incompatible constraint temporarily during migration. - Plugin-side DAL writes triggered by Admin API and Sync API writes execute in system scope while preserving the original context source.
Feature::triggerDeprecationOrThrow()accepts an optionalintroducedInargument for a version-prefixed message.
APIs and integrations
- Scope a standard integration to the intersection with an app user's ACL by
sending a valid
sw-app-user-id; empty or invalid values are ignored. - Use the synchronous translation list, install, update, and remove Admin API
actions with their matching
system:translationprivileges. - Prepare or download media through the Admin API media download actions.
- Set Store API product listing, search, and search-suggest
limitper request, subject toshopware.api.store.max_limit. - Refresh MCP tools when tool-list-change notifications report that a toolset's advertised availability changed.
Storefront and content
- Add non-price rule IDs through
ResolveCacheRelevantRuleIdsExtensionwhenCACHE_REWORKoutput varies by those rules. - Add dynamic navigation inputs through
CategoryLevelLoaderCacheKeyEventso cached navigation varies with extension state. - Use country-agnostic snippet names such as
enand validate withtranslation:validate. - Use
sw_block,sw_source,sw_include,sw_use,sw_embed,sw_from, andsw_importfor complete Storefront Twig import/include forms. - Apply CMS image minimum height only in
coverdisplay mode. - Use
ThumbnailGeneratedEventfor per-file thumbnail post-processing.
Operations
- Create a minimal plugin skeleton with
plugin:create --no-scaffold. - Opt into production sourcemaps only with
GENERATE_SOURCEMAPS=true NODE_ENV=production. - Consume the dedicated
webhooktransport whenWEBHOOKS_REWORKis enabled; deduplicate deliveries before using the drain-to-async rollback path. - Use the delayed-cache commands or Admin API action to inspect or flush queued cache tags; force invalidation only for a critical write.
- Set
SHOPWARE_SKIP_WEBINSTALLERto a non-empty value on a read-only PaaS deployment that must bypass installer lock checks. - Lower
shopware.filesystem.batch_write_sizefrom its default of 250 when S3 batch operations exhaust file descriptors.
Targeted checks
- For an order re-payment flow, verify the selected method has
afterOrderEnabled; otherwise the Store API returns HTTP 403 withCHECKOUT__ORDER_PAYMENT_METHOD_NOT_CHANGEABLE. - For document timestamp stability, configure the sales-channel business timezone rather than relying on an unset fallback.
- For direct product-export media URL expressions, remove manual URL encoding; the body renderer already applies RFC 3986 encoding.
- For custom PDF document renderers, set final bytes with
RenderedDocument::setContent(). - For ZUGFeRD corrections, call
withDocumentInformation()before adding deliveries, and overridegetPriceWithFallback()rather thangetPrice().