Skip to content
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ description: {Описание}
## Расположение *(если применимо)*

- Слой (Domain, Application, Infrastructure, Presentation).
- Путь: `{ProjectName}\Common\Module\{ModuleName}\{Layer}\{Context}\{Name}`
- Путь: `{ProjectName}\Common\Module\{ModuleName}\{Layer}\{GroupName?}\{Name}`

## Как используем

Expand Down
4 changes: 2 additions & 2 deletions docs/conventions/core-patterns/helper.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,12 @@ description: Правила создания и использования хе
**Infrastructure слой** — утилитные методы для инфраструктурных операций:

```
{ProjectName}\Common\Module\{ModuleName}\Infrastructure\Service\{Context}\Helper\{Name}Helper
{ProjectName}\Common\Module\{ModuleName}\Infrastructure\Service\{GroupName}\Helper\{Name}Helper
```

## Как используем

- Группирует утилиты одного узкого контекста.
- Группирует утилиты одной узкой группы.
- Используется через статический вызов.
- В DI не регистрируется.
- Хелпер не должен заменять сервисы — если нужна инъекция зависимостей, создавайте сервис.
Expand Down
16 changes: 8 additions & 8 deletions docs/conventions/core-patterns/service.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ description: Правила создания и использования се
- Интерфейс и реализация в `Domain`:

```php
{ProjectName}\Common\Module\{ModuleName}\Domain\Service\{Context?}\{ServiceName}ServiceInterface
{ProjectName}\Common\Module\{ModuleName}\Domain\Service\{Context?}\{ServiceName}Service
{ProjectName}\Common\Module\{ModuleName}\Domain\Service\{GroupName?}\{ServiceName}ServiceInterface
{ProjectName}\Common\Module\{ModuleName}\Domain\Service\{GroupName?}\{ServiceName}Service
```

## Как используем
Expand Down Expand Up @@ -87,13 +87,13 @@ description: Правила создания и использования се
- Интерфейс:

```php
{ProjectName}\Common\Module\{ModuleName}\Domain\Service\{Context?}\{ServiceName}ServiceInterface
{ProjectName}\Common\Module\{ModuleName}\Domain\Service\{GroupName?}\{ServiceName}ServiceInterface
```

- Реализация:

```php
{ProjectName}\Common\Module\{ModuleName}\Infrastructure\Service\{Context?}\{ServiceName}Service
{ProjectName}\Common\Module\{ModuleName}\Infrastructure\Service\{GroupName?}\{ServiceName}Service
```

## Как используем
Expand Down Expand Up @@ -126,8 +126,8 @@ description: Правила создания и использования се
- Интерфейс и реализация в `Application`:

```php
{ProjectName}\Common\Module\{ModuleName}\Application\Service\{Context?}\{ServiceName}ServiceInterface
{ProjectName}\Common\Module\{ModuleName}\Application\Service\{Context?}\{ServiceName}Service
{ProjectName}\Common\Module\{ModuleName}\Application\Service\{GroupName?}\{ServiceName}ServiceInterface
{ProjectName}\Common\Module\{ModuleName}\Application\Service\{GroupName?}\{ServiceName}Service
```

## Как используем
Expand All @@ -154,13 +154,13 @@ description: Правила создания и использования се
- Интерфейс:

```php
{ProjectName}\Common\Module\{ModuleName}\Domain\Service\{Context?}\{ServiceName}ServiceInterface
{ProjectName}\Common\Module\{ModuleName}\Domain\Service\{GroupName?}\{ServiceName}ServiceInterface
```

- Реализация:

```php
{ProjectName}\Common\Module\{ModuleName}\Integration\Service\{Context?}\{ServiceName}Service
{ProjectName}\Common\Module\{ModuleName}\Integration\Service\{GroupName?}\{ServiceName}Service
```

## Как используем
Expand Down
4 changes: 2 additions & 2 deletions docs/conventions/layers/application/event.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ description: Правила создания и использования до
- В слое [Application](../application.md):

```php
{ProjectName}\Common\Module\{ModuleName}\Application\Event\{Context?}\{EventName}Event
{ProjectName}\Common\Module\{ModuleName}\Application\Event\{GroupName?}\{EventName}Event
```

* `{Context?}` — опционально, используется для группировки по смыслу.
* `{GroupName?}` — опциональная группа событий по смыслу.
* `{EventName}` — имя события без суффикса `Event`.

## Когда использовать
Expand Down
3 changes: 0 additions & 3 deletions docs/conventions/layers/domain.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ src/Module/{ModuleName}/Domain/
│ ├── {EntityName}RepositoryInterface.php
│ └── Criteria/
├── Service/
│ └── Integration/
│ └── {ServiceName}Interface.php
├── Specification/
│ └── {SpecificationName}.php
└── Calculator/
Expand All @@ -42,4 +40,3 @@ src/Module/{ModuleName}/Domain/
- [ ] Репозитории — интерфейсы, а не реализации.
- [ ] Сущности проверяют инварианты.
- [ ] VO неизменяемы и инкапсулируют валидацию.

12 changes: 7 additions & 5 deletions docs/conventions/layers/domain/criteria.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ description: Правила создания критериев для филь

## Общие правила

- **Структура:** интерфейс и реализации в `Domain`, имя `{Entity}{Context}Criteria`.
- **Использование:** Репозиторий принимает интерфейс критерия. Один критерий описывает только один контекст выборки.
- **Структура:** интерфейс и реализации в `Domain`, имя `{EntityName}{SearchName}Criteria`.
- **Использование:** Репозиторий принимает интерфейс критерия. Один критерий описывает только один сценарий выборки.
- **Ограничения:** без бизнес-логики, только фильтры/пагинация/сортировка.
- **Способ задания:** через `set*()` или конструктор, `set*()` всегда `void` и с нормализацией.
- Для пагинации и сортировки применяются унифицированные интерфейсы:
Expand All @@ -37,14 +37,16 @@ description: Правила создания критериев для филь

```php
namespace {ProjectName}\Common\Module\{ModuleName}\Domain\Repository\{EntityName}\{EntityName}CriteriaInterface
namespace {ProjectName}\Common\Module\{ModuleName}\Domain\Repository\{EntityName}\Criteria\{CriteriaName}Criteria
namespace {ProjectName}\Common\Module\{ModuleName}\Domain\Repository\{EntityName}\Criteria\{EntityName}{SearchName}Criteria
namespace {ProjectName}\Common\Module\{ModuleName}\Domain\Repository\{EntityName}\Enum\{EntityName}SortFieldEnum; // при использовании enum
```

- `{SearchName}` — сценарий или способ поиска без имени сущности и суффикса `Criteria`, например `Find`, `Active`, `ByStatus`.

- Mapper в слое [Infrastructure](../infrastructure.md):

```php
namespace {ProjectName}\Common\Module\{ModuleName}\Infrastructure\Repository\{EntityName}\Criteria\Mapper\{CriteriaName}CriteriaMapper
namespace {ProjectName}\Common\Module\{ModuleName}\Infrastructure\Repository\{EntityName}\Criteria\Mapper\{EntityName}{SearchName}CriteriaMapper
```

## Как используем
Expand Down Expand Up @@ -179,7 +181,7 @@ final class PaymentFindCriteria implements PaymentCriteriaInterface, SortableCri

- [ ] Интерфейс критерия лежит в `Domain/Repository/{EntityName}`.
- [ ] Реализация находится в `Domain/Repository/{EntityName}/Criteria`.
- [ ] Название соответствует паттерну `{Entity}{Context}Criteria`.
- [ ] Название соответствует паттерну `{EntityName}{SearchName}Criteria`.
- [ ] В критерии нет бизнес-логики.
- [ ] `set*()` возвращают `void` и нормализуют данные.
- [ ] Пагинация/сортировка реализованы через унифицированные интерфейсы/трейты.
Expand Down
2 changes: 1 addition & 1 deletion docs/conventions/layers/domain/entity.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ description: Правила проектирования доменных сущ
- В слое [Domain](../domain.md):

```php
{ProjectName}\Common\Module\{ModuleName}\Domain\Entity\{Context}\{EntityName}Model
{ProjectName}\Common\Module\{ModuleName}\Domain\Entity\{GroupName?}\{EntityName}Model
```

## Как используем
Expand Down
4 changes: 2 additions & 2 deletions docs/conventions/layers/domain/specification.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ description: Правила использования паттерна Specific
- В слое [Domain](../domain.md):

```php
{ProjectName}\Common\Module\{ModuleName}\Domain\Specification\{Context}\{SpecificationName}Specification
{ProjectName}\Common\Module\{ModuleName}\Domain\Specification\{GroupName?}\{SpecificationName}Specification
```

`{Context}` используется при необходимости логически сгруппировать спецификации внутри модуля.
`{GroupName?}` используется при необходимости логически сгруппировать спецификации внутри модуля.

## Как используем

Expand Down
1 change: 0 additions & 1 deletion docs/conventions/layers/integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,3 @@ Integration слой отвечает за межмодульное взаимо
- [ ] Middleware адаптирует транспортный контекст, не реализуя бизнес-правила.
- [ ] Нет прямых вызовов к Domain/Infrastructure из Listener.
- [ ] Межмодульное взаимодействие идёт через Application-контракты.

4 changes: 2 additions & 2 deletions src/Sniffs/Structure/ServiceStructureSniff.php
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ private function assertServiceInCorrectDirectory(
$phpcsFile->addError(
sprintf(
'Service class "%s" must be placed in a Service/ directory.'
. ' Move it to .../Service/{Context?}/%s.' . self::DOC_REF,
. ' Move it to .../Service/{GroupName?}/%s.' . self::DOC_REF,
$className,
$className,
),
Expand All @@ -139,7 +139,7 @@ private function assertDomainServiceImplInServiceDirectory(
sprintf(
'Class "%s" implements Domain Service interface "%s"'
. ' but is not in a Service/ directory.'
. ' Move it to .../Service/{Context?}/%s.' . self::DOC_REF,
. ' Move it to .../Service/{GroupName?}/%s.' . self::DOC_REF,
$className,
$fqcn,
$className,
Expand Down
2 changes: 1 addition & 1 deletion tests/fixtures.php
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@
],
'warnings' => [],
],
// DtoStructureSniff — Domain DTO in Domain/Service/{Context}/ — correct path
// DtoStructureSniff — Domain DTO in Domain/Service/{GroupName}/ — correct path
[
'file' => __DIR__ . '/fixtures/src/Module/Example/Domain/Service/Payment/InitPaymentResultDto.inc',
'errors' => [],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

// Domain DTO in Domain/Dto/ — wrong path, should be Domain/Service/{Context}/
// Domain DTO in Domain/Dto/ — wrong path, should be Domain/Service/{GroupName}/
namespace App\Module\Example\Domain\Dto;

final readonly class WrongPathDto
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

// Domain DTO in Domain/Service/{Context}/ — correct path
// Domain DTO in Domain/Service/{GroupName}/ — correct path
namespace App\Module\Example\Domain\Service\Payment;

final readonly class InitPaymentResultDto
Expand Down
Loading