DevCraft Документации
СправочникBack-End

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

Manifest composer_required, синхронизация json/lock и использование Core-API.

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

Отдельно от этого DevCraft Admin может потреблять внешние shared-пакеты. На текущем этапе базовые DTO/fluent-абстракции выносятся в devcraftclub/dev-tools; границы ответственности описаны в Shared-пакеты и абстракции.

Manifest: composer_required

В manifest.php модуля:

'composer_required' => [
    [
        'name'         => 'devcraftclub/dev-tools',
        'minVersion'   => '^1.0',
        'hardRequired' => true,
    ],
],
  • hardRequired: true — пакет учитывается в метрике Dashboard и колонке «Обязательный».
  • При дубликате имени пакета в нескольких модулях атрибуция берётся от первого модуля в порядке реестра; required=true, если хотя бы один модуль объявил hardRequired: true.

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

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

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

Если пакет подключён только в composer.json, sync всё равно увидит его как установленный runtime-пакет. composer_required нужен дополнительно, когда зависимость должна считаться частью контрактной структуры модуля и отображаться в UI как required/recommended.

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

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

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

КлассНазначение
ComposerActionResultDTO результата
ComposerRuntimeAdapterCLI Composer
ComposerStateReaderЧтение lock
ManifestPackageReaderАгрегация manifest
ComposerDbSyncServiceSync с БД
PackagePolicyServiceПолитики
DefaultPackagePolicyStoreJSON-политики
ComposerDataORM-сущность

См. также

На этой странице