Skip to content

Revaz333/car_world

Repository files navigation

Быстрый старт

  1. Создаем репозиторий проекта с использованием данного шаблона
  2. Клонируем репозиторий на сервер в волюм нашего контейнера (который мы создавали по инструкции - https://www.notion.so/c7fa65cb76344ea39a9051dfd6053f2f?pvs=4)
  3. Устанавливаем зависимости выполнив команду
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 в которой лежат базовые классы ошибок:

ServiceExcpeption.php

<?php

namespace App\Domains\Common\Exceptions;

class ServiceException extends \Exception
{
}

NotFoundException.php

<?php

namespace App\Domains\Common\Exceptions;

class NotFoundException extends \Exception
{
}

Предварительные настройки

Настройка отлавливания ошибок

В приложении может быть несколько видов ошибок:
- 1. Ошибки бизнес логики
- 2. Системные ошибки
- 3. Ошибки валидации
Системные ощибки и ошибки валидации летят прямо в Handler.php, без дополнительной обработки. Ошибки бизнес логики же требуют дополнительной обработки. В конечном итоге все ошибки бизнес логики сводятся к одному общему expection - ServiceExpection, в который мы будем передавать текст ошибки и статус код.

app/Exceptions/Handler.php

<?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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published