112 lines
3.3 KiB
Markdown
112 lines
3.3 KiB
Markdown
|
|
# Code Patterns
|
|||
|
|
|
|||
|
|
Переиспользуемые паттерны кодовой базы. Используй существующие — не изобретай новые без необходимости.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. Kernel — статический контейнер
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
// Инициализация (один раз при старте воркера)
|
|||
|
|
Kernel::init($container);
|
|||
|
|
|
|||
|
|
// Получение сервиса
|
|||
|
|
$service = Kernel::getContainer()->get(MyService::class);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Kernel хранит единственный инстанс контейнера на весь процесс воркера.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. ContainerFactory — сборка контейнера
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
$factory = new ContainerFactory($config, $environment);
|
|||
|
|
$container = $factory->build();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Autoload: все файлы из `routes/` и `services/` подхватываются автоматически.
|
|||
|
|
Не регистрируй маршруты и сервисы вручную в `index.php` — кладёт файлы в соответствующие директории.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. Router и RouteDefinition
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
// routes/api.php
|
|||
|
|
return [
|
|||
|
|
new RouteDefinition('GET', '/users/{id}', UserController::class, 'show'),
|
|||
|
|
];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Router находит нужный маршрут по методу и пути, извлекает параметры и вызывает контроллер.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. Middleware — цепочка обработки запроса
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
class MyMiddleware implements MiddlewareInterface {
|
|||
|
|
public function handle(Request $request, callable $next): Response {
|
|||
|
|
// до
|
|||
|
|
$response = $next($request);
|
|||
|
|
// после
|
|||
|
|
return $response;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Middleware регистрируются в контейнере и применяются ко всем запросам в воркере.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. ORM — атрибуты сущностей
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
#[Collection('users')]
|
|||
|
|
class UserEntity {
|
|||
|
|
#[Field('_id')]
|
|||
|
|
public string $id;
|
|||
|
|
|
|||
|
|
#[Field('name')]
|
|||
|
|
public string $name;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Repository наследует базовый класс и получает методы `find`, `findOne`, `save`, `delete` из коробки.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. JWT Auth
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
// AuthMiddleware автоматически валидирует Bearer-токен
|
|||
|
|
// В контроллере — получить текущего пользователя из request
|
|||
|
|
$user = $request->getAttribute('user');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`JwtService` отвечает за выпуск и верификацию токенов. Конфиг: секрет и TTL через `Config`.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. Config — конфигурация
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
$value = Config::get('key');
|
|||
|
|
$value = Config::get('section.key', $default);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Конфиг загружается из `environment.php` (или `.env`). Доступен глобально через статический метод.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. WorkerRunner — цикл обработки запросов
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
// Внутри worker.php
|
|||
|
|
$runner = new WorkerRunner($kernel);
|
|||
|
|
$runner->run(); // FrankenPHP loop: запрос → роутинг → middleware → контроллер → ответ
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`WorkerRunner` перехватывает исключения и возвращает корректный HTTP-ответ даже при ошибке.
|