- Создаем репозиторий проекта с использованием данного шаблона
- Клонируем репозиторий на сервер в волюм нашего контейнера (который мы создавали по инструкции - https://www.notion.so/c7fa65cb76344ea39a9051dfd6053f2f?pvs=4)
- Устанавливаем зависимости выполнив команду
docker exec -it container_name composer updateДанный шаблон представляет собой полностью настроенный Laravel 10. Шаблон собран с использованием принципов DDD.
app/
├── Common # Интерфейсы и базовые классы основных сущностей
│ └── Contracts
│ └── #Contract name#
├── Console # Консольные операции
│ ├── Commands
│ │ └── #Command#
│ └── Kernel.php
├── Http # Папка входа в приложение
│ ├── Controllers
│ └── Models # Модели для работы с БД
│ └── #Model name#
├── Domains # Наши домены (микросервисы)
│ └── #Domain name#
│ ├── Usecase # Элементы бизнес логики (каждое действие - это отдельный usecase)
│ │ └── #Usecase#
│ ├── Interfaces # Интерфейсы репозиториев и утилит
│ │ └── #Interface name#
│ ├── Dto # Классы для передачи данных между подсистемами приложения
│ │ └── #Dto nameDto#
│ ├── Exceptions # Ошибки текущего домена
│ │ └── #Exception name#
│ ├── Repositories # Классы для работы с базой данных
│ │ └── #Repository#
│ ├── Requests # Классы для бинда входящих данных и их валидации
│ │ └── #Request#
│ ├── Resources # Классы для формирования ответов от сервера
│ │ └── #Resource#
│ └── Services # Классы для работы со сторонними сервисами
│ └── #Service name#
database/
└── migrations # Наши миграции
└── #migration name#
routes/
├── api.php # базовый роутер
└── #route name# # под каждый домен отдельный файл с роутами
codecaption.yml # Конфигурация библиотеки для написания тестов codecaption
tests/
└── #Test name# - # Сюда складываем все тесты
Seeders/
└── #Seeder name# # Название такое же как у таблицы
Общие классы - это калассы которые мы можем использовать как в близнес логике, так и снаружи пириложения (например в репоизиториях и.т.п).
К общим классам могу относиться например классы ошибок.
Для хранения общих классов, в директории app/Domains заведена папка Common.
По умолчанию в этой папке уже есть папка Exceptions в которой лежат базовые классы ошибок:
<?php
namespace App\Domains\Common\Exceptions;
class ServiceException extends \Exception
{
}<?php
namespace App\Domains\Common\Exceptions;
class NotFoundException extends \Exception
{
}
В приложении может быть несколько видов ошибок:
- 1. Ошибки бизнес логики
- 2. Системные ошибки
- 3. Ошибки валидации
Системные ощибки и ошибки валидации летят прямо в Handler.php, без дополнительной обработки.
Ошибки бизнес логики же требуют дополнительной обработки.
В конечном итоге все ошибки бизнес логики сводятся к одному общему expection - ServiceExpection, в который мы будем передавать текст ошибки и статус код.
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use App\Domains\Common\Exceptions\ServiceException;
use Illuminate\Validation\ValidationException;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* The list of the inputs that are never flashed to the session on validation exceptions.
*
* @var array<int, string>
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
public function render($request, Throwable $exception)
{
list($message, $code) = match(get_class($exception))
{
ServiceException::class => [
['other' => $exception->getMessage()],
$exception->getCode(),
],
ValidationException::class => [
$exception->validator->errors()->getMessages(),
422,
],
default => [
$exception->getMessage(),
400
]
};
return response()->json([
'errors' => $message,
], $code);
}
}Для логирования используется утилита Telescope
Открыть ее можно по ссылке https://example.com/telescope.
Приложение обязательно дожно быть покрыто тестами.
Для тестирования мы используем библиотеку Codeception (в шаблон она уже подключена).
Тесты расположены в папке tests.
В папке tests содаем файл по шаблону #DomainName#Cest.php.
Тесты должны охватывать максимальное количество возможных ошибок, при этом процесс написания по большей части должен быть выполнением Copy/Paste
Так же помимо тестов, в нашем шаблоне есть папка Seeders - это сущности для работы с базо данных через тесты, используется для создания записей в базе данных на время выполнения теста, по завершению теста запись удаляется.
Название Seeders должно соответствовать названию таблицы в БД.
Все тесты
docker exec -it container_name vendor/bin/codecept run apiОдин тест
docker exec -it container_name vendor/bin/codecept run TestCest:testName