Перейти к содержанию

Composer-пакеты модулей

DevCraft предоставляет общие сервисы в DevCraft\Core\Composer для установки пакетов, синхронизации с БД и проверки политик. Admin-UI использует те же классы, что и пользовательские модули.

Manifest: composer_required

В manifest.php модуля:

PHP
1
2
3
4
5
6
7
'composer_required' => [
    [
        'name'         => 'vendor/example-package',
        'minVersion'   => '^1.0',
        'hardRequired' => true,
    ],
],
  • hardRequired: true — пакет учитывается в метрике Dashboard и колонке «Обязательный».
  • При дубликате имени пакета в нескольких модулях атрибуция берётся от первого модуля в порядке реестра; required=true, если хотя бы один модуль объявил hardRequired: true.

Подробнее: Манифест модуля — composer_required.

Синхронизация json → lock → БД

  1. ComposerDbSyncService::syncFromRuntimeSnapshot() — полный sync:
  2. union из devcraft/composer.json require (без php/ext-*) и manifest-only пакетов;
  3. installed / version из composer.lock через ComposerStateReader.
  4. После успешного AJAX-действия — applySuccessfulAction() с повторным чтением lock.

Ручной sync: DevCraft Admin → Composer → Синхронизировать с composer.lock.

Использование в модуле (AJAX)

PHP
use DevCraft\Core\Composer\ComposerDbSyncService;
use DevCraft\Core\Composer\ComposerRuntimeAdapter;
use DevCraft\Core\Composer\PackagePolicyService;
use DevCraft\Core\Http\AjaxRequest;
use DevCraft\Core\Http\JsonResponse;
use DevCraft\Core\Interfaces\AjaxHandlerInterface;

final class ExampleInstallHandler implements AjaxHandlerInterface
{
    public function handle(AjaxRequest $request): JsonResponse
    {
        $package = (string) ($request->data['package'] ?? '');
        $blocked = (new PackagePolicyService())->validateAction('install', $package);
        if ($blocked !== null) {
            return JsonResponse::fail(__('Ошибка'), $blocked->toArray()['message'], 'policy_violation', 409);
        }

        $result = (new ComposerRuntimeAdapter())->install($package);
        if ($result->toArray()['status'] === 'ok') {
            (new ComposerDbSyncService())->applySuccessfulAction('install', $package);
        }

        return JsonResponse::ok($result->toArray(), __('Операция Composer выполнена'));
    }
}

Важно: не импортировать DevCraft\Modules\Admin\*; защита только через DLE admin_sections в manifest.

Классы Core

Класс Назначение
ComposerActionResult DTO результата
ComposerRuntimeAdapter CLI Composer
ComposerStateReader Чтение lock
ManifestPackageReader Агрегация manifest
ComposerDbSyncService Sync с БД
PackagePolicyService Политики
DefaultPackagePolicyStore JSON-политики
ComposerData ORM-сущность

См. также

  • ComposerActionHandler — эталон в Admin (если документирован)
  • Registry — порядок модулей для атрибуции