2026-02-18 19:54:52 +07:00
2026-02-18 19:54:52 +07:00
2026-02-18 19:54:52 +07:00
2026-02-18 19:54:52 +07:00
2026-02-18 19:54:52 +07:00
2026-02-18 19:54:52 +07:00
2026-02-18 19:54:52 +07:00
2026-02-18 19:54:52 +07:00

Тестовое задание

Версия php 8.5

Laravel 12

Контейнер с приложением работает на frankenphp

На хост машине

make help
make build
make install # копирует .env.example в рабочий .env, для удобства,так же запускает миграции
make run # заполнит базу и запустит тесты

Необходимо задать переменные окружения

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

Так же необходимо настроить сервисы, например через внешние .env Сейчас доступы хардкод в compose.yaml

  mysql:
    image: mysql:8.4.8
    container_name: laravel_mysql
    restart: unless-stopped
    ports:
      - "127.0.0.1:3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
    volumes:
      - mysql:/var/lib/mysql
    networks:
      - laravel_network
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-psecret" ]
      timeout: 10s
      retries: 5
      start_period: 30s
      interval: 30s
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: laravel_phpmyadmin
    restart: unless-stopped
    ports:
      - "127.0.0.1:8585:80"
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
      PMA_USER: laravel
      PMA_PASSWORD: secret
      PMA_ARBITRARY: 1
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - laravel_network

Маршруты

/api namespace

Route::prefix('tasks')->name('tasks.')->group(function () {
    Route::get('/', [TaskController::class, 'index'])->name('index');
    Route::post('/', [TaskController::class, 'store'])->name('store');
    Route::get('/{task}', [TaskController::class, 'show'])->name('show');
    Route::match(['put', 'patch'], '/{task}', [TaskController::class, 'update'])->name('update');
    Route::delete('/{task}', [TaskController::class, 'destroy'])->name('destroy');
});

Роуты не защищал, установлен пакет laravel/sanctum, можно настроить токены\

Родительский контроллер использует AuthorizesRequests, можно реализовать Policy

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Routing\Controller as BaseController;

abstract class Controller extends BaseController
{
    use AuthorizesRequests;
}

Пример реализации

// в конструкторе контроллера
public function __construct()
{
    $this->authorizeResource(Task::class, 'task');
}

Тесты

Feature

Unit

Расширение фильтров

Конфиг

Фильтры должны реализовывать FilterInterface для работы в Pipeline

Requests содержащие фильтры должны реализовывать RequestFilterInterface

Документация API

Task

Комментарий:

Апи может присылать полные дубли строк, думал делать вставку через upsert + уникальный ключ например по хешу основных строк, но выбрал более простой вариант с обычным заполнением

Ссылка на хостинг

https://pma.din9xtr.tech/

Description
Тестовое апи с тасками
Readme 126 KiB
Languages
PHP 53.4%
Blade 45.1%
Makefile 0.6%
Dockerfile 0.4%
JavaScript 0.3%
Other 0.2%