- Скопировать файл .env.example в .env и указать там данные для бд
DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=main DB_USERNAME=postgres DB_PASSWORD=password
composer install
php artisan key:generate
php artisan migrate:fresh --seed
php artisan serve
- Создать файл .env в папке /front/.env и указать путь к API
VITE_API_URL=http://localhost:8000/api
npm install
npm run dev
- Можете настроить nginx config под себя в файле nginx/default.conf
server {
listen 80;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location / {
proxy_pass http://front:4321;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- Запуск
docker compose up -d --build
- В этом проекте использовано как можно больше разных видов реляций между моделями
public function question(): BelongsTo
{
return $this->belongsTo(Question::class, "question_id", "id");
}
public function pass_tests(): HasMany
{
return $this->hasMany(PassTest::class, "user_id", "id");
}
public function pass_courses(): BelongsToMany
{
return $this->belongsToMany(Course::class, "pass_courses", "user_id", "course_id");
}
public function answers(): HasManyThrough
{
return $this->hasManyThrough(Answer::class, Question::class, "test_id", "question_id", "id", "id");
}
- Код полностью удовлетворяет требованиям
ООП
,SOLID
,KISS
,DRY
,YAGNI
Архитектура выглядит таким образом routes -> controllers -> services
- Нормализована архитектура базы данных
База данных выполнена по стандартам нормализации базы данных
- Использовалась админ панель Laravel Nova
- В докерной версии сервера используется php сервер swoole
для полной ассинхронности и JIT компиляции что улучшает быстроту работы API
- Конфиг
nginx
находится в самом проекте что улучшает компактность проекта - Для развертывания проекта используется
docker-compose.yml
файл - Так же используется стандарт
ACID
, все не однополосные запросы выполняются через транзакцию и блокировку бд
DB::transaction(function() use($r, $u) {
$p_t = new PassTest();
$p_t->user_id = $u->id;
$p_t->test_id = $r['test_id'];
$p_t->save();
foreach($r['answers'] as $answer) {
$q_p_t = new QuestionPassTest();
$q_p_t->is_right = $this->is_right($answer['id']);
$q_p_t->question_id = $answer['question_id'];
$q_p_t->pass_tests_id = $p_t->id;
$q_p_t->save();
}
$t = Test::find($r['test_id']);
$u->points = $u->points + $t->points;
$u->save();
return $p_t->id;
});