Code Style

Данный документ описывает стандарты кодирования. Все новые модули и код должны соответствовать этим правилам для обеспечения единообразия, поддерживаемости и масштабируемости.

1. Общие принципы


2. Соглашения по именованию

ЭлементСоглашениеПример
КлассыPascalCaseUserController, IdRange
ИнтерфейсыPascalCase с префиксом IIUserRepository
ТрейтыPascalCase с суффиксом TraitLoggableTrait
Абстрактные классыPascalCase с префиксом AbstractAbstractRepository
ИсключенияPascalCase с суффиксом ExceptionUserNotFoundException
DTO-классыPascalCase с суффиксом DtoUserDto, CollectionDto
Репозитории (интерфейсы/реализации)PascalCase с суффиксом RepositoryCommandRepository, IUserRepository
Репозитории (реализации бд)PascalCase с суффиксом Repository и префиксом DbDbCommandRepository, DbUserRepository
Persistance (файлы записи бд)PascalCase с суффиксом ARDbCommandRepository, DbUserRepository
Value Object'ыPascalCase, описывают сущностьIdRange, Email
КонтроллерыPascalCase с суффиксом ControllerUserController, DocsController
Свойства / переменныеcamelCase$userName, $createdAt
КонстантыUPPER_SNAKE_CASESTATUS_ACTIVE
Методы / функцииcamelCasegetUserById(), handleRequest()
Приватные методыcamelCase с префиксом _ (опционально)_formatArgs() (в шаблоне используется)
Файлы классовсоответствуют классуUserController.php
Конфигурационные файлыsnake_casedb.php, modules.php
Интегрирующие конфиг-файлыsnake_case с префиксом ____include.php

3. DTO (Data Transfer Objects)

Все ответы контроллеров должны быть обёрнуты в один из стандартных DTO:

Все DTO реализуют интерфейс JsonSerializable и сериализуются в JSON в соответствии с ожидаемой структурой.

4. Контроллеры


5. Обработка ошибок

6. Код-стайл (форматирование)

Придерживаемся PSR-12 со следующими дополнениями:

Пример:

'mailer' => [
    'class'     => Mailer::class,
    'viewPath'  => '@app/mail',
    'useFileTransport' => true, //<- вот это выбивается, но не мешает чтению
],
или
$result['_meta'] = [
    'total' => $this->total,
    'page'  => $this->page,
    'limit' => $this->limit,
    'pages' => $this->limit ? ceil($this->total / $this->limit) : null
];

Пример:

public function __construct(
    public array $items,
    public ?int $total  = null,
    public ?int $page   = null,
    public ?int $limit  = null,
) {}
или
public function __construct(
    string $type,
    string $value,
    bool $confirmed,
    public ?int $limit = null,
) {
    $this->type     = $type;
    $this->value    = $value;
    $this->confirmed = $confirmed;
    $this->limit    = $limit;
}

Пример:

if (ex) {...
for (...) {...
public function method() {...

И помним о том что наш код не должен причинять вреда глазам и мозгу других участников команды по возможности конечно)

I am file