Convention over Configuration

We don't want you to waste time when you program, so we follow the principles of Conventions Over Configuration.

Following these rules will also make it easier to maintain your code in the future by other developers.

Principles and rules

Here are the most important rules:

  • KISS - Keep it simple, stupid

  • YAGNI - You Arent Gonna Need It

  • DRY - Don’t repeat yourself

  • SOLID - The First 5 Principles of Object Oriented Design

  • The Boy Scout Rule - Leave your code better than you found it


  • Use english names only (class names, method names, comments, variables names, database table and field names, etc…).

  • Use class suffixes / prefixes according to PSR Naming Conventions.

  • Follow industry best practices for your directory and file structure:

Database Conventions

  • Table names should be singular, e.g. when we have a User entity class, the table in the database should be named user by default. See the reasoning behind it here

  • Entity property names are used for column names.

  • Entity properties that are named ID or classname ID are recognized as primary key properties.

  • A property is interpreted as a foreign key property if it's named <navigation property name><primary key property name> (for example, StudentID for the Student navigation property since the Student entity's primary key is ID). Foreign key properties can also be named the same - simply <primary key property name> (for example, EnrollmentID since the Enrollment entity's primary key is EnrollmentID).

Common rules

  • All methods must have type declaration and return type declaration.

  • Methods without return statement must declared with void as their return type.

  • Class properties must have typed properties (PHP 7.4+).

  • Don’t mix data types for parameters and return types, except for nullable.

  • Don’t extend classes or create abstract classes for the sake of “code reuse”, except for traits with test code only.

  • Create final classes by default, except you have to mock it (e.g. repositories).

  • Create private methods by default. Don’t create protected methods.

  • All method parameters must be used.

Dependency injection

  • Use composition over inheritance.

  • Declare all class dependencies only within the constructor.

  • Don’t inject the container (PSR-11). The service locator is an anti-pattern.

  • A constructor can accept only dependencies as object.

  • Scalar data types (string, int, float, array) are not allowed for the constructor. Pass them as parameter object.


Read more

File Uploads

  • For files that are uploaded by users, each module should use the /uploads folder

In this section we used materials from various authors, incl. Daniel Opitz

Last updated