Skip to content

2021-08-10 - Storefront coding standars

You are viewing an outdated version of the documentation.
Click here to switch to the stable version (v6.6), or use the version switcher on the left to navigate between versions.

2021-08-10 - Storefront coding standars

INFO

This document represents an architecture decision record (ADR) and has been mirrored from the ADR section in our Shopware 6 repository. You can find the original version here

Context

  • The current coding standards are not put into an ADR yet.
  • This ADR is to determine the current standards to have a start from where to enhance the storefront concept further more.

Decision

Controller

  • Each controller action has to be declared with a @Since tag
  • Each controller action requires a @Route annotation
  • The name of the route should be starting with "frontend"
  • Each route should define the corresponding HTTP Method (GET, POST, DELETE, PATCH)
  • Routes which renders pages for the storefront (GET calls) are calling a respective pageloader to get the data it needs.
  • The function name should be concise
  • Each function should define a return type hint
  • A route should have a single purpose
  • Use Symfony flash bags for error reporting
  • Each storefront functionality has to be available inside the store-api too
  • A storefront controller should never contain business logic
  • The controller class requires the annotation: @RouteScope(scopes={"storefront"})
  • Depending services has to be injected over the class constructor
  • Depending services has to be defined in the DI-Container service definition
  • Depending services has to be assigned to a private class property
  • A storefront controller has to extend the \Shopware\Storefront\Controller\StorefrontController
  • Using LoginRequired annotation to identify whether the Customer is logged in or not.
  • Each storefront functionality needs to make use of a store-api route service. to make sure, this functionality is also available via API

Operations inside Storefront controllers

A storefront controller should never use a repository directly, It should be injected inside a Route.

Routes which should load a full storefront page, should use a PageLoader class to load all corresponding data that returns a Page-Object.

Pages which contains data which are the same for all customers, should have the @HttpCache annotation

Write operations inside Storefront controllers

Write operations should create their response with the createActionResponse function to allow different forwards and redirects. Each write operation has to call a corresponding store-api route.

Page-/PageletLoader

  • A PageLoader is a class which creates a page-object with the data for the called whole page.
  • A PageletLoader is a class which creates a pagelet-object with the data for a part of a page.

The pageLoaders are a specific class to load the data for a given page. The controller calls the pageloader, which collects the needed data for that page via the Store-api. The pageloader can call other pageletloaders to get the data for pagelets(subcontent for a page). The pageloader always returns a page-object.

Consequences

All dependencies in the controllers for routes which render a page have to be moved to the Loaders and if still missing, the Loader and Page has to be created. All direct DAL-dependencies inside the storefront have to be moved to Store-Api routes and respective calls. All other dependencies which are not allowed have to be checked for individual alternatives