Coding Standards

To keep the codebase unified, we use automated tools for checking coding standards. These tools are parts of our package - shopsys/coding-standards.

You can run all the standards checks by calling

php phing standards

Hint

In this step, you were using Phing target standards.
More information about what Phing targets are and how they work can be found in Console Commands for Application Management (Phing Targets)

A lot of the violations of the rules can be fixed automatically by calling

php phing standards-fix

Standards that are not checked automatically

Besides the rules that are checked by automatic tools, we have few rules for which there are no automatic checks yet:

  • CSS classes are named-with-dash. CSS classes for JavaScript purposes are prefixed with "js-" prefix

    <div class="js-bestselling-products list-products-line">

  • Names in configuration files (e.g., parameters_common.yaml) are underscored

    shopsys.display_cron_overview_for_superadmin_only

  • Methods for data retrieving are prefixed with "get". If the method can return null, it is prefixed with "find" instead.

      /**
       * @param int $id
       * @return \Shopsys\FrameworkBundle\Model\Product\Product|null
       */
      public function findById($id)
      {
          return $this->getProductRepository()->find($id);
      }
    
      /**
       * @param int $id
       * @return \Shopsys\FrameworkBundle\Model\Product\Product
       */
      public function getById($id)
      {
          $product = $this->findById($id);
    
          if ($product === null) {
              throw new \Shopsys\FrameworkBundle\Model\Product\Exception\ProductNotFoundException('Product with ID ' . $id . ' does not exist.');
          }
    
          return $product;
      }
    
  • Names of form validation groups must be in camelCase and declared as constants (except for Symfony Default validation group)

      const VALIDATION_GROUP_COMPANY_CUSTOMER = 'companyCustomer';
    
  • Too long XML and HTML tags are divided by the following pattern:

      <tag
         attr1="foo"
         attr2="bar"
       />
    
  • Too long conditions are divided by the following pattern:

      if ($orderFormData->getCompanyName() !== null
         || $orderFormData->getCompanyNumber() !== null
         || $orderFormData->getCompanyTaxNumber() !== null
       ) {
    
  • Database table and column names are underscored. Names must not be PostgreSQL keywords. To prevent conflicts, names of the tables are in the plural.

  • Everything possible is ordered alphabetically (.gitignore content, configuration files, imports, etc.)
  • When annotating an array, it is mandatory to state the type of array's items (including scalar types)

      /**
       * @param int[] $ids
       * @return \Shopsys\FrameworkBundle\Model\Product\Product[]
       */
      public function getAllByIds($ids)
      {
          return $this->getProductRepository()->findBy(['id' => $ids]);
      }
    
  • All monetary values (prices, account balances, discount amounts, price limits, etc.) must be represented and manipulated by the Money class.