Shopware Knowledge Patch
Use this skill for Shopware development, upgrades, extension compatibility,
Store API or Admin API integration, Storefront customization, Administration
customization, and deployment configuration. Start with the quick checks below,
then open the task-specific reference before changing code or configuration.
Reference index
| Reference |
Topics |
| Administration |
Vite and Vue 3, Pinia, Meteor components, CMS and rule-condition extension points, notifications, dashboard, sourcemaps |
| Storefront |
ESI pagelets, route state, navigation, forms, snippets, accessibility, Twig, themes, cookies, feeds, images |
| APIs and integrations |
Store API and Admin API contracts, MCP, translations, media downloads, sessions, integration ACLs, OpenAPI |
| Data and search |
DAL contracts, criteria, indexing, product streams, Elasticsearch/OpenSearch, cache keys, SEO, entities |
| Extensions and framework |
Plugins, apps, custom fields, scheduled tasks, Symfony, Composer, exceptions, hooks, configuration |
| Operations and infrastructure |
Platform baseline, cache, queues, Redis, Varnish, filesystems, PaaS, JWT, Shopware Services, CLI setup |
| Commerce and documents |
Payments, orders, customers, rules, addresses, tax providers, documents, ZUGFeRD, measurements |
Breaking-change triage
Administration build and state
- Migrate custom Administration builds from
webpack.config.js to
vite.config.js and distribute a 6.7-specific build.
- Native Vue 3 is in use and components are async by default. Guard template
refs or use
@vue:mounted.
- Core state uses
Shopware.Store; register Pinia stores with
Shopware.Store.register() and mutate state in actions.
- Replace migrated
sw-* basic components with their mt-* equivalents and
account for their changed value, event, and prop contracts.
See Administration.
Storefront chrome and extension points
- Store API
Cached*Route decorators are removed.
- Header and footer now render through
/header and /footer ESI requests,
with new layout entry points and base_esi_header / base_esi_footer.
- Header/footer data belongs in their pagelet loaders and loaded events, not
GenericPageLoader, Page, or ErrorTemplateStruct.
- Use
activeRoute, window.activeRoute, and .is-active-route-* instead of
the former controller/action state.
See Storefront.
Payment and customer contracts
- Extend
AbstractPaymentHandler; the former sync, async, prepared, refund,
and recurring handler interfaces are deprecated.
- App manifests use
manifest-3.0.xsd and pay-url rather than capture-url.
- Payment and shipping API writes and plugin installers must supply a stable
technicalName.
- Customer default-payment behavior is removed in favor of the last-used or
current method.
See Commerce and documents.
DAL and extension definitions
- Plugin
Resources/config/entities.xml custom entities are unsupported; use
an EntityDefinition or attribute entities.
- Many-to-many mapping definitions must declare foreign-key fields, and
EntityExtension::getEntityName() is mandatory.
- Search-result wrappers are separating from collections. Call collection
methods on
$result->getEntities() and iterate searchResult.entities.
Criteria::excludeFields() can omit storage columns without returning
partial entities, but cannot be combined with addFields().
See Data and search.
Cache, queues, and infrastructure
- Cache invalidation is delayed through the
shopware.invalidate_cache
scheduled task; the prior delay switch is removed.
- Under
WEBHOOKS_REWORK, explicitly consume the webhook transport or
deliveries accumulate.
- Varnish requires XKeys; cache tags can no longer be stored in Redis.
- Redis DSNs now belong to named connections, and dependent configuration uses
connection keys rather than dsn or url.
- JWTs use only
APP_SECRET, which must contain at least 32 characters.
See Operations and infrastructure.
High-use migration recipes
Create a minimal plugin
bin/console plugin:create MyPlugin MyNamespace --no-scaffold
--no-scaffold creates only the required plugin skeleton.
Validate foreign keys for MySQL 8.4
dal:validate rejects a foreign key that does not reference a complete primary
or unique key. Versioned entities commonly need the missing version_id.
Temporarily tolerate a constraint during migration with:
bin/console dal:validate --tolerate-foreign-key=constraint_name
Opt into production sourcemaps
Set GENERATE_SOURCEMAPS=true together with NODE_ENV=production:
GENERATE_SOURCEMAPS=true NODE_ENV=production composer build:js:admin
GENERATE_SOURCEMAPS=true NODE_ENV=production composer build:js:storefront
Other production values keep sourcemaps disabled; non-production builds always
generate them.
Consume and roll back webhook transport
With WEBHOOKS_REWORK enabled, consume webhook explicitly, preferably before
the other transports:
bin/console messenger:consume webhook async low_priority
For rollback, stop webhook workers and run:
bin/console webhook:drain-to-async
Draining can redeliver messages, so receivers must deduplicate using
X-Shopware-Event-Id or body eventId. Recover crashed rows left as running
before draining.
Flush delayed cache invalidations
- Use
sw-force-cache-invalidate: 1 for a critical Admin API write.
- Run
cache:clear:delayed or call DELETE /api/_action/cache-delayed to flush
queued tags.
- Run
cache:watch:delayed to inspect queued tags.
Configure a custom Storefront route name
Allowlist route names that do not use the frontend, widgets, or payment
prefixes:
storefront:
router:
allowed_routes: [swag.test.foo-bar]
Exclude heavy DAL fields
$criteria->excludeFields(['description', 'keywords']);
Excluded properties keep their typed entity defaults. Unknown, required, or
write-protected top-level fields cannot be excluded.
Configure read-only deployments
Set a non-empty value to bypass web-installer and install.lock checks and
avoid writes to the project root and public .htaccess:
SHOPWARE_SKIP_WEBINSTALLER=1
Update installed translations
The daily translation.update task performs the same refresh as
translation:update and POST /api/_action/translation/update. Disable it
with:
bin/console scheduled-task:deactivate translation.update
When no translations are installed, the task makes no remote request.
Start a local Shopware CLI project
With Docker and Shopware CLI installed:
shopware-cli project create mystore
cd mystore
make up
make setup
The generated default serves the Storefront at http://127.0.0.1:8000, the
Administration at http://127.0.0.1:8000/admin, and uses admin / shopware.
Task routing
- For a template, component, or Administration override, read
Administration or
Storefront before selecting an extension point.
- For routes, schemas, ACLs, webhooks, MCP, translations, or media transfer,
read APIs and integrations.
- For DAL definitions, queries, indexing, product streams, search, and cache
relevance, read Data and search.
- For plugin/app lifecycle, framework APIs, exceptions, constraints, custom
fields, and scheduled handlers, read
Extensions and framework.
- For workers, caching, filesystems, hosting, environment variables, Redis,
Varnish, or service reconciliation, read
Operations and infrastructure.
- For checkout, payments, customers, orders, rules, addresses, documents, or
units, read Commerce and documents.
1---2name: shopware-knowledge-patch3description: Shopware4license: MIT5---678# Shopware Knowledge Patch910Use this skill for Shopware development, upgrades, extension compatibility,11Store API or Admin API integration, Storefront customization, Administration12customization, and deployment configuration. Start with the quick checks below,13then open the task-specific reference before changing code or configuration.1415## Reference index1617| Reference | Topics |18| --- | --- |19| [Administration](references/administration.md) | Vite and Vue 3, Pinia, Meteor components, CMS and rule-condition extension points, notifications, dashboard, sourcemaps |20| [Storefront](references/storefront.md) | ESI pagelets, route state, navigation, forms, snippets, accessibility, Twig, themes, cookies, feeds, images |21| [APIs and integrations](references/apis-and-integrations.md) | Store API and Admin API contracts, MCP, translations, media downloads, sessions, integration ACLs, OpenAPI |22| [Data and search](references/data-and-search.md) | DAL contracts, criteria, indexing, product streams, Elasticsearch/OpenSearch, cache keys, SEO, entities |23| [Extensions and framework](references/extensions-and-framework.md) | Plugins, apps, custom fields, scheduled tasks, Symfony, Composer, exceptions, hooks, configuration |24| [Operations and infrastructure](references/operations-and-infrastructure.md) | Platform baseline, cache, queues, Redis, Varnish, filesystems, PaaS, JWT, Shopware Services, CLI setup |25| [Commerce and documents](references/commerce-and-documents.md) | Payments, orders, customers, rules, addresses, tax providers, documents, ZUGFeRD, measurements |2627## Breaking-change triage2829### Administration build and state3031- Migrate custom Administration builds from `webpack.config.js` to32 `vite.config.js` and distribute a 6.7-specific build.33- Native Vue 3 is in use and components are async by default. Guard template34 refs or use `@vue:mounted`.35- Core state uses `Shopware.Store`; register Pinia stores with36 `Shopware.Store.register()` and mutate state in actions.37- Replace migrated `sw-*` basic components with their `mt-*` equivalents and38 account for their changed value, event, and prop contracts.3940See [Administration](references/administration.md).4142### Storefront chrome and extension points4344- Store API `Cached*Route` decorators are removed.45- Header and footer now render through `/header` and `/footer` ESI requests,46 with new layout entry points and `base_esi_header` / `base_esi_footer`.47- Header/footer data belongs in their pagelet loaders and loaded events, not48 `GenericPageLoader`, `Page`, or `ErrorTemplateStruct`.49- Use `activeRoute`, `window.activeRoute`, and `.is-active-route-*` instead of50 the former controller/action state.5152See [Storefront](references/storefront.md).5354### Payment and customer contracts5556- Extend `AbstractPaymentHandler`; the former sync, async, prepared, refund,57 and recurring handler interfaces are deprecated.58- App manifests use `manifest-3.0.xsd` and `pay-url` rather than `capture-url`.59- Payment and shipping API writes and plugin installers must supply a stable60 `technicalName`.61- Customer default-payment behavior is removed in favor of the last-used or62 current method.6364See [Commerce and documents](references/commerce-and-documents.md).6566### DAL and extension definitions6768- Plugin `Resources/config/entities.xml` custom entities are unsupported; use69 an `EntityDefinition` or attribute entities.70- Many-to-many mapping definitions must declare foreign-key fields, and71 `EntityExtension::getEntityName()` is mandatory.72- Search-result wrappers are separating from collections. Call collection73 methods on `$result->getEntities()` and iterate `searchResult.entities`.74- `Criteria::excludeFields()` can omit storage columns without returning75 partial entities, but cannot be combined with `addFields()`.7677See [Data and search](references/data-and-search.md).7879### Cache, queues, and infrastructure8081- Cache invalidation is delayed through the `shopware.invalidate_cache`82 scheduled task; the prior delay switch is removed.83- Under `WEBHOOKS_REWORK`, explicitly consume the `webhook` transport or84 deliveries accumulate.85- Varnish requires XKeys; cache tags can no longer be stored in Redis.86- Redis DSNs now belong to named connections, and dependent configuration uses87 `connection` keys rather than `dsn` or `url`.88- JWTs use only `APP_SECRET`, which must contain at least 32 characters.8990See [Operations and infrastructure](references/operations-and-infrastructure.md).9192## High-use migration recipes9394### Create a minimal plugin9596```bash97bin/console plugin:create MyPlugin MyNamespace --no-scaffold98```99100`--no-scaffold` creates only the required plugin skeleton.101102### Validate foreign keys for MySQL 8.4103104`dal:validate` rejects a foreign key that does not reference a complete primary105or unique key. Versioned entities commonly need the missing `version_id`.106Temporarily tolerate a constraint during migration with:107108```bash109bin/console dal:validate --tolerate-foreign-key=constraint_name110```111112### Opt into production sourcemaps113114Set `GENERATE_SOURCEMAPS=true` together with `NODE_ENV=production`:115116```bash117GENERATE_SOURCEMAPS=true NODE_ENV=production composer build:js:admin118GENERATE_SOURCEMAPS=true NODE_ENV=production composer build:js:storefront119```120121Other production values keep sourcemaps disabled; non-production builds always122generate them.123124### Consume and roll back webhook transport125126With `WEBHOOKS_REWORK` enabled, consume `webhook` explicitly, preferably before127the other transports:128129```bash130bin/console messenger:consume webhook async low_priority131```132133For rollback, stop webhook workers and run:134135```bash136bin/console webhook:drain-to-async137```138139Draining can redeliver messages, so receivers must deduplicate using140`X-Shopware-Event-Id` or body `eventId`. Recover crashed rows left as `running`141before draining.142143### Flush delayed cache invalidations144145- Use `sw-force-cache-invalidate: 1` for a critical Admin API write.146- Run `cache:clear:delayed` or call `DELETE /api/_action/cache-delayed` to flush147 queued tags.148- Run `cache:watch:delayed` to inspect queued tags.149150### Configure a custom Storefront route name151152Allowlist route names that do not use the `frontend`, `widgets`, or `payment`153prefixes:154155```yaml156storefront:157 router:158 allowed_routes: [swag.test.foo-bar]159```160161### Exclude heavy DAL fields162163```php164$criteria->excludeFields(['description', 'keywords']);165```166167Excluded properties keep their typed entity defaults. Unknown, required, or168write-protected top-level fields cannot be excluded.169170### Configure read-only deployments171172Set a non-empty value to bypass web-installer and `install.lock` checks and173avoid writes to the project root and public `.htaccess`:174175```bash176SHOPWARE_SKIP_WEBINSTALLER=1177```178179### Update installed translations180181The daily `translation.update` task performs the same refresh as182`translation:update` and `POST /api/_action/translation/update`. Disable it183with:184185```bash186bin/console scheduled-task:deactivate translation.update187```188189When no translations are installed, the task makes no remote request.190191### Start a local Shopware CLI project192193With Docker and Shopware CLI installed:194195```bash196shopware-cli project create mystore197cd mystore198make up199make setup200```201202The generated default serves the Storefront at `http://127.0.0.1:8000`, the203Administration at `http://127.0.0.1:8000/admin`, and uses `admin` / `shopware`.204205## Task routing206207- For a template, component, or Administration override, read208 [Administration](references/administration.md) or209 [Storefront](references/storefront.md) before selecting an extension point.210- For routes, schemas, ACLs, webhooks, MCP, translations, or media transfer,211 read [APIs and integrations](references/apis-and-integrations.md).212- For DAL definitions, queries, indexing, product streams, search, and cache213 relevance, read [Data and search](references/data-and-search.md).214- For plugin/app lifecycle, framework APIs, exceptions, constraints, custom215 fields, and scheduled handlers, read216 [Extensions and framework](references/extensions-and-framework.md).217- For workers, caching, filesystems, hosting, environment variables, Redis,218 Varnish, or service reconciliation, read219 [Operations and infrastructure](references/operations-and-infrastructure.md).220- For checkout, payments, customers, orders, rules, addresses, documents, or221 units, read [Commerce and documents](references/commerce-and-documents.md).