Добавить readme.md
Добавлено описание структуры Signed-off-by: Андрей Брусницын <brusnitsyn@brusoff.su>
This commit is contained in:
259
readme.md
Normal file
259
readme.md
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user