Самодиагностика CRM системы?

Коллеги приветствую.

Участвую в команде по разработке CRM системы.
Сложность растёт пропорционально количеству хотелок.
Помимо багов в проекте есть данные которые зависят от других данных.

Например.
Проект, у которого есть определённые статусы, этих статусов может и не быть.
Например, если нет статусов то нужно запретить ряд действий на фронте.
То есть юзер может дальше работать, но ряд функций недоступны.

И это уже не говорит о том что это баг.
На самом деле это одно из требований.

Но юзер должен знать по какой причине ему недоступны эти функции.

Я подумал что можно создать некий специальный метод, для определения зависимости данных и выдавать списком что нужно делать и по какой причине недоступны эти функции.

Хотелось бы услышать рекомендации по этому поводу.

Спасибо.
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ответы на вопрос 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Делал нечто подобное, получилось так:
namespace App\Doctor;

use App\Doctor\Check\CheckInterface;

final class Doctor
{
    /**
     * @var CheckInterface[]
     */
    private iterable $checks;

    public function __construct(iterable $checks)
    {
        $this->checks = $checks;
    }

    /**
     * @return Violation[]|array
     */
    public function check(): array
    {
        $violations = [];
        foreach ($this->checks as $check) {
            $violations[$check->feature()] = array_merge($violations[$check->feature()] ?? [], $check->violations());
        }

        return $violations;
    }
}

namespace App\Doctor\Check;

use App\Doctor\Violation;

interface CheckInterface
{
    public function feature(): string;

    /**
     * @return Violation[]
     */
    public function violations(): array;
}

services:
    _instanceof:
        App\Doctor\Check\CheckInterface:
            tags:
                - { name: app.doctor.check }

    App\Doctor\Doctor:
        arguments:
            $checks: !tagged app.doctor.check

public function doctorAction(): JsonResponse
{
    return $this->json($this->doctor->check());
}

{
    "foo": [], // Ok
    "bar": [
        { "message": "Отсутствуют статусы", "treatment": "Добавьте статусы" }
    ]
}


Как вариант, можно группировать проверки по фичам, чтоб не проверять все, когда нужна информация по конкретной фиче, но для этого надо будет CompilerPass заюзать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы