From 31e322d992870359943376b96f8a814126909bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=91=D1=80=D1=83?= =?UTF-8?q?=D1=81=D0=BD=D0=B8=D1=86=D1=8B=D0=BD?= Date: Fri, 7 Nov 2025 10:35:52 +0900 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20readme.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлено описание структуры Signed-off-by: Андрей Брусницын --- readme.md | 259 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100644 readme.md diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..d80dd7d --- /dev/null +++ b/readme.md @@ -0,0 +1,259 @@ +# Схема Domain Architecture + +``` +app/ +├── Domains/ # 🎯 ЯДРО - Бизнес-логика +│ ├── User/ # Домен Пользователи +│ │ ├── Actions/ # Бизнес-действия (Use Cases) +│ │ │ ├── CreateUserAction.php +│ │ │ ├── UpdateUserProfileAction.php +│ │ │ └── DeleteUserAction.php +│ │ ├── Models/ # Сущности предметной области +│ │ │ ├── User.php +│ │ │ └── ValueObjects/ +│ │ │ └── Email.php +│ │ ├── DataTransferObjects/ # DTO - передача данных +│ │ │ ├── UserData.php +│ │ │ └── CreateUserData.php +│ │ ├── Collections/ # Кастомные коллекции +│ │ │ └── UserCollection.php +│ │ ├── Contracts/ # Интерфейсы (Абстракции) +│ │ │ ├── UserRepositoryInterface.php +│ │ │ └── PasswordHasherInterface.php +│ │ ├── Events/ # События домена +│ │ │ ├── UserCreated.php +│ │ │ └── UserUpdated.php +│ │ ├── Listeners/ # Обработчики событий +│ │ │ ├── SendWelcomeEmail.php +│ │ │ └── LogUserActivity.php +│ │ ├── Rules/ # Бизнес-правила валидации +│ │ │ └── UniqueUserEmail.php +│ │ ├── Services/ # Доменные сервисы +│ │ │ └── UserRegistrationService.php +│ │ ├── Exceptions/ # Доменные исключения +│ │ │ └── UserNotFoundException.php +│ │ └── Enums/ # Перечисления +│ │ └── UserStatus.php +│ ├── Product/ # Домен Продукты +│ │ ├── Actions/ +│ │ ├── Models/ +│ │ └── Contracts/ +│ └── Order/ # Домен Заказы +│ ├── Actions/ +│ ├── Models/ +│ └── Events/ +├── Application/ # 🚀 СЛОЙ ПРИЛОЖЕНИЯ +│ ├── Providers/ # Сервис-провайдеры +│ │ ├── DomainServiceProvider.php +│ │ └── AuthServiceProvider.php +│ ├── Console/ # Artisan команды +│ │ └── Commands/ +│ │ └── ProcessOrdersCommand.php +│ ├── Http/ # Тонкие контроллеры +│ │ └── Requests/ +│ │ └── CreateUserRequest.php +│ └── Resources/ # API Resources +│ └── UserResource.php +└── Infrastructure/ # 🔧 ИНФРАСТРУКТУРА + ├── Http/ # Внешние адаптеры + │ ├── Controllers/ + │ │ ├── UserController.php + │ │ └── Api/ + │ │ └── V1/ + │ └── Middleware/ + ├── Database/ # Данные и персистентность + │ ├── Migrations/ + │ ├── Seeders/ + │ ├── Factories/ + │ └── Repositories/ # Реализации репозиториев + │ ├── Eloquent/ + │ │ └── UserRepository.php + │ └── CachedUserRepository.php + ├── Notifications/ # Внешние уведомления + │ └── UserWelcomeNotification.php + ├── Mail/ # Email шаблоны + │ └── WelcomeEmail.php + └── Services/ # Внешние сервисы + ├── Payment/ + │ └── StripePaymentService.php + └── Sms/ + └── TwilioSmsService.php +``` + +## 🔄 Поток данных через слои + +``` +HTTP Request + → Infrastructure/Http/Controllers/UserController + → Application/Http/Requests/CreateUserRequest (валидация) + → Domains/User/Actions/CreateUserAction (бизнес-логика) + → Domains/User/Contracts/UserRepositoryInterface + → Infrastructure/Database/Repositories/UserRepository (реализация) + → Database +``` + +## 📋 Детальное описание компонентов + +**🎯 Domains/ - Ядро бизнес-логики** + +**Actions/** - Бизнес-действия (Use Cases): + +```php +namespace App\Domains\User\Actions; + +class CreateUserAction +{ + public function __construct( + private UserRepositoryInterface $users, + private PasswordHasherInterface $hasher + ) {} + + public function execute(CreateUserData $data): User + { + // Вся бизнес-логика создания пользователя + $user = new User([ + 'name' => $data->name, + 'email' => $data->email, + 'password' => $this->hasher->hash($data->password), + ]); + + $this->users->save($user); + event(new UserCreated($user)); + + return $user; + } +} +``` + +**Models/** - Сущности с бизнес-логикой: + +```php +namespace App\Domains\User\Models; + +class User extends Model +{ + public function activate(): void + { + $this->status = UserStatus::ACTIVE; + $this->activated_at = now(); + } + + public function isActive(): bool + { + return $this->status === UserStatus::ACTIVE; + } +} +``` + +**Contracts/** - Абстракции (Dependency Inversion): + +```php +namespace App\Domains\User\Contracts; + +interface UserRepositoryInterface +{ + public function findByEmail(string $email): ?User; + public function save(User $user): void; + public function delete(User $user): void; +} +``` + +**DataTransferObjects/** - Объекты передачи данных: + +```php +namespace App\Domains\User\DataTransferObjects; + +class CreateUserData extends DataTransferObject +{ + public string $name; + public string $email; + public string $password; + + public static function fromRequest(CreateUserRequest $request): self + { + return new self([ + 'name' => $request->validated('name'), + 'email' => $request->validated('email'), + 'password' => $request->validated('password'), + ]); + } +} +``` + +## 🚀 Application/ - Слой приложения + +**Тонкие контроллеры**: + +```php +namespace App\Infrastructure\Http\Controllers; + +use App\Domains\User\Actions\CreateUserAction; +use App\Domains\User\DataTransferObjects\CreateUserData; + +class UserController extends Controller +{ + public function store(CreateUserRequest $request, CreateUserAction $createUser) + { + $userData = CreateUserData::fromRequest($request); + $user = $createUser->execute($userData); + + return new UserResource($user); + } +} +``` + +## 🔧 Infrastructure/ - Техническая реализация + +**Реализации репозиториев**: + +```php +namespace App\Infrastructure\Database\Repositories\Eloquent; + +use App\Domains\User\Contracts\UserRepositoryInterface; +use App\Domains\User\Models\User; + +class UserRepository implements UserRepositoryInterface +{ + public function findByEmail(string $email): ?User + { + return User::where('email', $email)->first(); + } + + public function save(User $user): void + { + $user->save(); + } +} +``` + +## 🔗 Взаимодействие между слоями + +**Dependency Rule**: + +- **Domains** ← ничего не зависит от других слоев +- **Application** ← зависит только от Domains +- **Infrastructure** ← зависит от Domains и Application + +**Пример регистрации зависимостей**: + +```php +// app/Application/Providers/DomainServiceProvider.php +namespace App\Application\Providers; + +use Illuminate\Support\ServiceProvider; +use App\Domains\User\Contracts\UserRepositoryInterface; +use App\Infrastructure\Database\Repositories\Eloquent\UserRepository; + +class DomainServiceProvider extends ServiceProvider +{ + public function register(): void + { + // Связывание интерфейсов с реализациями + $this->app->bind(UserRepositoryInterface::class, UserRepository::class); + $this->app->bind(PasswordHasherInterface::class, BcryptPasswordHasher::class); + + // Регистрация Actions + $this->app->singleton(\App\Domains\User\Actions\CreateUserAction::class); + } +} +``` \ No newline at end of file