PHPackages                             survos/data-bundle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. survos/data-bundle

ActiveSymfony-bundle[Utility &amp; Helpers](/categories/utility)

survos/data-bundle
==================

NOT survos/dataset-bundle. Namespace: Survos\\DataBundle (no 'set'). Database and tooling layer for survos/data-contracts: keyword→ContentType classification cache (VocabMap) and ContentType display-label translations (VocabLabel).

2.10.25(1mo ago)0732↓48.3%2MITPHPPHP ^8.5

Since Feb 5Pushed 1mo agoCompare

[ Source](https://github.com/survos/data-bundle)[ Packagist](https://packagist.org/packages/survos/data-bundle)[ GitHub Sponsors](https://github.com/kbond)[ RSS](/packages/survos-data-bundle/feed)WikiDiscussions main Synced 2w ago

READMEChangelogDependencies (101)Versions (182)Used By (2)

Survos DataBundle
=================

[](#survos-databundle)

> ⚠️ **NOT** `survos/dataset-bundle` (note the extra `set`). Different package, different namespace.
>
> PackageNamespaceBundle classPurpose`survos/data-bundle` (this)`Survos\DataBundle``SurvosDataBundle`Normalize-time term extraction + a parked vocab/authority classifier`survos/dataset-bundle``Survos\DatasetBundle``SurvosDatasetBundle`Dataset filesystem conventions (`APP_DATA_DIR`)Both bundles can be installed side-by-side. Don't merge their namespaces in `composer.json` autoload — it silently masks classes from the other.

⚠️ Status (2026-06): mostly dormant, slated to move
---------------------------------------------------

[](#️-status-2026-06-mostly-dormant-slated-to-move)

This bundle is **not** the home of shared semantic contracts — those are item DTOs, vocabularies, and `ContentType`, which live in [`survos/data-contracts`](../../../lib/data-contracts) (being renamed **`cho-contracts`**, `Survos\Cho`). The contracts are what consumers across the monorepo actually need.

What's left in *this* bundle is a small set of **normalize-time** helpers plus a **parked authority/classifier feature** that was started and never finished. After re-reading the code (2026-06), the honest accounting is below. The leading plan is to **stop requiring this bundle in non-normalizing apps and move the surviving pieces into the normalizer (md)** — see [Direction](#direction).

### What actually runs today

[](#what-actually-runs-today)

ComponentTriggerNotes`VocabTermExtractorListener`auto-registered on `ImportConvertFinishedEvent`Scans the normalize JSONL and writes a per-dataset term inventory to `{dataset}/30_terms/{termType}.{lang}.jsonl` (e.g. `genre.en.jsonl`, `medium.fr.jsonl`). Term types come from `ItemField` / `MuseumVocab` constants. These files feed `folio:ingest` as `TermSet` + `Term` rows. **This is the one genuinely useful, wired path.**`NormalizeFallbackListener`auto-registered on `ImportConvertRowEvent` (priority -10)Sets `iiif_base` to the best source image URL when unset. **This is not vocab-related** — it's a generic normalize fallback that happens to live here. Candidate to move to import/media/md.`vocab:export` / `vocab:import`CLIJSONL round-trip of the two tables below. The only way rows ever get into those tables.### Dormant / not wired (the parked classifier)

[](#dormant--not-wired-the-parked-classifier)

ComponentState`VocabMap` (`vocab_map` table) — `(lang, normKeyword) → contentType` cache**No consuming app migrates or populates this table.** The `confidence`/`model` columns anticipate an AI classifier that **does not exist**.`VocabLabel` (`vocab_label` table) — `(contentType, lang) → label`Same: no migration, no producer.`VocabResolver` — wraps `ContentType::fromRecord()` with a `VocabMap` lookup**Injected by nobody.** A complete consumer with no caller.`TermSetExtractor` — derives `termSet.jsonl`/`term.jsonl` from `obj.profile.json`**Injected by nobody.** Overlaps conceptually with the listener above.### Things the old README claimed that aren't true

[](#things-the-old-readme-claimed-that-arent-true)

- There is **no `vocab:map` command** and **no `dto_map.jsonl` / `labels.jsonl`** under `$APP_DATA_DIR/vocab/`. That whole "diff + AI call for misses → shared language-level map" pipeline was aspirational and never built.
- `VocabMap` is **not** "populated by the AI classifier via `ai-workflow-bundle`." The AI bundles consume `ContentType` from contracts directly; they never touch these tables.
- The extractor writes `30_terms/{termType}.{lang}.jsonl`, **not** `30_terms/vocab.jsonl`.

How it got here
---------------

[](#how-it-got-here)

This bundle was born when **harvest (formerly `mus`)** and **md** were *both* in the normalizing business, and it needed a shared place for term extraction and a keyword→type classifier. That dual-normalizer situation **still holds** (2026-06): md has 18 provider normalizers (`Singleton/*`), **harvest still has 15** (`Dataset/*`), and ssai's `MaracRegistrantsListener` fires the same `ImportConvert*` events. So this is a **normalize-layer** bundle shared by md + harvest + ssai — not yet an md-only concern. The classifier ambition — using extensive Europeana / musdig vocabularies as portable controlled authorities — was valuable but got parked before the AI loop was wired.

Authority / controlled-vocabulary lists are still worth having. Parking them does not mean abandoning them.

Direction
---------

[](#direction)

Under active discussion (not yet executed):

1. **Contracts → `cho-contracts`.** The portable, language-neutral DTO/vocabulary/`ContentType`layer (today `survos/data-contracts`) is what most consumers actually need. ssai, for example, needs the *contracts*, not this bundle.
2. **Drop it from the apps that don't normalize.** Required by md, zm, ssai, harvest, mediary, mus, rsun — but the live listeners only matter where `ImportConvert*` events fire. **md, harvest, ssai** normalize and should keep it; **zm, mus, mediary, rsun**have zero normalizers and inject nothing, so it's pure dead weight there (and drags in ORM + `import-bundle` + `dataset-bundle` + `field-bundle` + `kit-bundle`).
3. **Fold the survivors into md only after normalization consolidates there.** Today the term-extraction listener is shared by three normalizers, so it can't collapse into md until harvest's `Dataset/*` and ssai's Marac import either retire or delegate to md. `NormalizeFallbackListener` (iiif\_base) isn't vocab and should move out independently — to import/media — regardless of the rest.
4. **If the authority/vocab classifier is revived,** prefer a **shared SQLite registry**(the same pattern now used for the dataset/provider registry) over per-application sync — one shared `vocab_map`/`vocab_label` source instead of migrating and importing into every app's database.

Install (current)
-----------------

[](#install-current)

```
composer require survos/data-bundle
```

```
// config/bundles.php
Survos\DataBundle\SurvosDataBundle::class => ['all' => true],
```

File locations are resolved via `DataPaths` (now in `survos/dataset-bundle`):

PathPurpose`{dataset}/30_terms/{termType}.{lang}.jsonl`Per-dataset extracted term inventory (live)Note for future schema/type work
--------------------------------

[](#note-for-future-schematype-work)

Symfony **8.1** `TypeInfo` now supports **object shapes**. This may be useful when we need to describe folio/archive custom payloads with a compact, typed PHPDoc contract before (or instead of) introducing a full formal schema layer.

Reference syntax:

```
use Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver;

$resolver = new StringTypeResolver();
$type = $resolver->resolve('object{name: string, age: int, email?: string}');
```

Equivalent programmatic form:

```
use Symfony\Component\TypeInfo\Type;

$type = Type::objectShape([
    'name' => Type::string(),
    'age' => Type::int(),
    'email' => ['type' => Type::string(), 'optional' => true],
]);
```

###  Health Score

51

—

FairBetter than 95% of packages

Maintenance89

Actively maintained with recent releases

Popularity18

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity72

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

181

Last Release

56d ago

PHP version history (3 changes)2.0.109PHP ^8.3

2.0.139PHP ^8.4

2.8.0PHP ^8.5

### Community

Maintainers

![](https://www.gravatar.com/avatar/21b39551f92ed4143772c622f9e571589c5a72c96ab3c53fe67489ce0d83e806?d=identicon)[tacman1123](/maintainers/tacman1123)

---

Top Contributors

[![tacman](https://avatars.githubusercontent.com/u/619585?v=4)](https://github.com/tacman "tacman (47 commits)")

---

Tags

symfonyclassificationfacetsvocabularycontenttype

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/survos-data-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/survos-data-bundle/health.svg)](https://phpackages.com/packages/survos-data-bundle)
```

###  Alternatives

[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k18.3M430](/packages/easycorp-easyadmin-bundle)[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.5k6.0M779](/packages/sylius-sylius)[2lenet/crudit-bundle

The easy like Crud'it Bundle.

1617.3k16](/packages/2lenet-crudit-bundle)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.4M236](/packages/sulu-sulu)[pimcore/pimcore

Content &amp; Product Management Framework (CMS/PIM/E-Commerce)

3.8k3.9M535](/packages/pimcore-pimcore)[contao/core-bundle

Contao Open Source CMS

1301.7M3.1k](/packages/contao-core-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
