atoolo/citygov-bundle
CityGov is Sitepark's information management system for municipal and district administration websites and intranet employee portals, bundling all relevant city information and official services into one platform. This Symfony bundle integrates CityGov features into atoolo-based PHP applications.
Build vs. buy for public-sector portals. atoolo/citygov-bundle is a pre-built integration layer for Sitepark's CityGov product family — municipal and district administration websites plus employee intranets. It ships domain objects most teams would otherwise build from scratch: online-service records and links, person/contact directories with search and suggest, teaser/GraphQL projections, and search-index documents enriched with full text, alternative titles, and sort-friendly keys (e.g. startletter normalized without umlauts). That is a strong argument for buy/adopt on the content-and-search half of a government portal, and for build only on the citizen-facing frontend where differentiation actually lives.
The Laravel caveat is the first decision. This is a Symfony bundle, not a Laravel package. It registers services, config, and document-enrichment hooks into the Symfony container and the atoolo/search-bundle + atoolo/resource-bundle indexing pipeline. In a Laravel codebase the realistic adoption paths are:
Roadmap sequencing it enables.
OnlineServiceFeature GraphQL projection (1.3.0 teaser, 1.4.0 service list) is the integration point for mobile apps, chatbots, and third-party portals. This is the highest-leverage feature for a Laravel team: GraphQL is the seam that makes the Symfony/Laravel split invisible to product.Use cases this actually unlocks: consolidating legacy municipal CMS instances onto one API-first platform; employee intranets with searchable staff directories and role-scoped service catalogs; citizen self-service for permits, registrations, and fee payments where the catalog is CityGov-managed and the transaction is yours.
What it does not decide for you: frontend framework, auth/identity, payments, workflow/back-office case handling, or hosting sovereignty. Those remain product decisions the bundle is silent on.
Adopt when all of these hold:
atoolo/search-bundle conventions rather than designing a schema yourself.leikanumber metadata, umlaut-normalized sort keys, alternative-title indexing) and would otherwise reverse-engineer them.Evaluate, but proceed with eyes open, when:
Look elsewhere when:
atoolo/search-bundle ^1.14), which is healthy but means pinning and regression testing on every bump.Minimum due-diligence checklist before adoption: pin a version and read its release notes; confirm the atoolo/search-bundle and resource-bundle versions you inherit; get a written support/upgrade commitment from Sitepark; and prototype the Laravel↔Symfony GraphQL seam end-to-end in a spike before it enters a roadmap.
To executives — one paragraph. CityGov is the incumbent platform for municipal and district administration portals in the German-speaking market, and this bundle is the ready-made integration layer for it. Adopting it lets us ship a compliant, searchable public-service portal in a fraction of the time a greenfield build would take, because the hard domain details — service catalogs, staff directories, official reference numbers, German text normalization, SEO-oriented indexing — are already solved and actively maintained. The license is MIT, so there is no licensing cost or lock-in on the code itself. The real commitment is architectural: it runs on Symfony, so we operate it as a dedicated content-and-search service behind our Laravel application rather than mixing it into the app. That is a deliberate, bounded decision with a well-understood interface — GraphQL and a search index — and it is reversible if needed.
To engineering — the honest version. This is a Symfony bundle with real rigor: PHPStan level 9, E2E tests, codecov, PHP 8.1 through 8.4 supported, clean release notes. It is also a vendor-owned component: zero stars, zero dependents, one committer organization, and a dependency chain into atoolo/search-bundle that moves independently of us. So: we adopt it as an external service we control the boundary of, not as a library we sprinkle through the codebase. Concretely — run the CityGov indexing stack in its own Symfony deployment, expose GraphQL for online services and person search, let Laravel own auth, UX, transactions, and business workflow, and treat the Solr schema as a versioned contract. Pin versions, add contract tests on the GraphQL surface, and re-run them on every atoolo/* bump. If the spike shows the seam is more expensive than a native Laravel search implementation for our actual query set, we say so and walk — and we will know that within two weeks, not two quarters.
The ask. Fund a two-week integration spike: stand up the bundle in a Symfony container, index a sample of CityGov content, and prove GraphQL person-search and online-service retrieval from the Laravel app. Deliverable is a go/no-go with a measured cost for the seam versus the native-Laravel alternative, plus a written support expectation from Sitepark. This is the cheapest possible way to convert a 0-star, single-vendor dependency into a decision we can defend on evidence.
How can I help you explore Laravel packages today?