Composer-пакеты модулей
Manifest composer_required, синхронизация json/lock и использование Core-API.
DevCraft предоставляет общие сервисы в DevCraft\Core\Composer для установки пакетов, синхронизации с БД и проверки политик. Admin-UI использует те же классы, что и пользовательские модули.
Manifest: composer_required
В manifest.php модуля:
'composer_required' => [
[
'name' => 'vendor/example-package',
'minVersion' => '^1.0',
'hardRequired' => true,
],
],hardRequired: true— пакет учитывается в метрике Dashboard и колонке «Обязательный».- При дубликате имени пакета в нескольких модулях атрибуция берётся от первого модуля в порядке реестра;
required=true, если хотя бы один модуль объявилhardRequired: true.
Подробнее: Манифест модуля — composer_required.
Синхронизация json → lock → БД
ComposerDbSyncService::syncFromRuntimeSnapshot()— полный sync:- union из
devcraft/composer.jsonrequire(безphp/ext-*) и manifest-only пакетов; installed/versionизcomposer.lockчерезComposerStateReader.
- union из
- После успешного AJAX-действия —
applySuccessfulAction()с повторным чтением lock.
Ручной 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
| Класс | Назначение |
|---|---|
| ComposerActionResult | DTO результата |
| ComposerRuntimeAdapter | CLI Composer |
| ComposerStateReader | Чтение lock |
| ManifestPackageReader | Агрегация manifest |
| ComposerDbSyncService | Sync с БД |
| PackagePolicyService | Политики |
| DefaultPackagePolicyStore | JSON-политики |
| ComposerData | ORM-сущность |
См. также
ComposerActionHandler— эталон AJAX-обработчика в Admin (класс в коде модуля)- Registry — порядок модулей для атрибуции