SonataAdminBundle, read through its own asset manifest
The missing Symfony Admin Generator
At a glance
- What is it?
- SonataAdminBundle calls itself the missing Symfony admin generator, yet its repository carries almost no prose about using it. What it does expose in full is the interface stack it imposes: AdminLTE 2, Bootstrap 3, a jQuery family of plugins, and a Node 18 asset build.
- Who is it for?
- SonataAdminBundle suits teams already on Symfony that accept its pinned interface, AdminLTE 2 on Bootstrap 3 with jQuery 3.7, and want back office screens without writing them. Leave it if your public site already runs a newer Bootstrap, because those constraints are not negotiable through configuration.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 10 days ago.
- What is it written in?
- Mainly PHP, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
SonataAdminBundle and the admin layer it builds
SonataAdminBundle is a PHP Symfony bundle whose repository description is one line long: The missing Symfony Admin Generator. The topics attached to it, admin, admin-generator, admin-lte and symfony-bundle, put the intended reader squarely in a Symfony shop that wants back office screens over its own data instead of hand written CRUD controllers, and the homepage points at sonata-project.org/bundles/admin.
Two naming details come before any feature talk. The repository is called SonataAdminBundle, while the composer package behind the README badges is sonata-project/admin-bundle, so a composer require line will not match the repository name. The default branch is 4.x, and a second line of work sits on 5.x, which the README's own table labels unstable beside 4.x; both rows carry test, coverage and documentation badges, so the split is deliberate rather than a leftover.
A generated README that documents nothing but badges
The first lines of the README instruct contributors not to edit the file and add that it is auto-generated by sonata-project/dev-kit. That single comment explains the shape of everything below it: a branch table, a link to the documentation site, a StackOverflow tag for support, a pointer to CONTRIBUTING.md, and one sentence about the licence. There is no install command, no bundle registration snippet, no configuration example and no admin class anywhere in it.
That makes the repository weak evidence for an adoption decision. A reader who wants to know how an admin class is declared, which service tags exist, or what the filter and form defaults are has to leave the repository and open docs.sonata-project.org, which is where the README sends every practical question. Reasonable for a bundle whose documentation is versioned elsewhere, less useful when the question is whether the project still fits the version of Symfony you run.
AdminLTE 2 and Bootstrap 3 pinned in the shipped assets
The runtime dependency list in package.json is the most concrete statement of what the bundle renders with. admin-lte is pinned to 2.4 and bootstrap to 3.3, and around them sit jquery at 3.7.0 with jquery-ui at 1.13, jquery-form, jquery-slimscroll and jquery.scrollto, then qs, select2 at 4.0, x-editable at 1.5, icheck, masonry-layout, fontawesome-free and the source-sans-pro webfont. Two entries cut across the rest of that list: @hotwired/stimulus and @symfony/stimulus-bridge both sit at 3.2, and select2-bootstrap-theme is held at a beta tag, 0.1.0-beta.10, inside a set of production dependencies, which is the kind of constraint that surfaces as a rendering bug rather than an install failure.
For an adopter the consequence is blunt. A project already on a newer Bootstrap cannot drop this bundle in without a styling collision, because those numbers are constraints rather than hints, and the README documents no switch for replacing the theme.
Node 18 floor and a private npm manifest for a PHP bundle
A PHP bundle rarely carries a JavaScript engines field, and this one does: node must be at least 18, and browserslist is set to defaults, so the browser matrix is resolved from that single word rather than from anything configured inside the bundle. The same manifest sets private to true, which keeps this asset package out of any public registry, and the compiled output travels inside the composer package instead. That is why the root holds webpack.config.js, postcss.config.js, .babelrc.js, .prettierignore and prettier.config.js next to the PHP tree in src.
@symfony/webpack-encore is a devDependency at 5.2, sitting beside webpack at 5.98 and webpack-cli at 5.0, and the four scripts below are what a contributor runs:
"scripts": {
"dev-server": "encore dev-server",
"dev": "encore dev",
"watch": "encore dev --watch",
"build": "encore production"
}Three of them serve a developer's machine and the fourth compresses a build for distribution, so the production script is the one a publishing job would invoke.
The Makefile lints containers, Twig, xliff and YAML
The quality gate inside the repository lives in the Makefile, and for a bundle of this size it is unusually wide. Composer metadata is normalized and validated, YAML goes through yamllint, and every XML and xliff file is piped through xmllint and diffed against its own reformatted output, which pins indentation at four spaces for XML and two for xliff. PHP style is checked in dry-run mode with php-cs-fixer under PHP_CS_FIXER_IGNORE_ENV=1, a variable that lets the fixer run against a PHP version other than the one it was installed under.
Four targets then hand src and tests to the Symfony console:
lint-symfony-container:
bin/console lint:container
lint-symfony-twig:
bin/console lint:twig src tests
lint-symfony-xliff:
bin/console lint:xliff src tests
lint-symfony-yaml:
bin/console lint:yaml src testsThat last group checks the public surface rather than the internals. A bundle that ships service definitions in XML and xliff files can break a consumer's container while its own phpunit.xml.dist run stays green, so a passing test suite does not by itself mean the container compiles.
Two upgrade documents anchored at the 4.x line
Upgrade cost shows up in the names at the root. UPGRADE-4.0.md and UPGRADE-4.x.md sit beside the README as two separate documents, and the file names alone tell you the project treats the 4.0 step and the ongoing 4.x line as distinct upgrade events rather than one continuous record. With the default branch on 4.x, a team starting fresh consults the second file on every minor step, while a shop still on the previous major line inherits the first as well.
Static analysis is arranged the same way, with phpstan.neon.dist, a phpstan-baseline.neon file that records findings the project has chosen not to fix, rector.php for automated refactoring, and a phpstan-console-application.php entry point covering the console side of the code base. A baseline is where to look first when analysis fails on a version you just changed, because it lists the exact findings the maintainers deferred. The last push landed on 2026-06-04, one day after the 4.43.0 tag on 2026-06-03, so the 4.x branch was still receiving work at that point.
Where the bundle is the wrong tool for the job
The honest limitation is visibility. An engineer cannot judge this bundle from its repository, because the file that would show a working admin class is the one file marked do not edit, and every practical detail sits on docs.sonata-project.org instead. The second limitation is the asset floor: admin-lte at 2.4 and bootstrap at 3.3 are constraints in package.json, not preferences, so a product team that already modernized its public front end inherits a styling conflict before a single admin screen exists.
The alternative approach is to keep administration inside the application as ordinary Symfony routes and Twig templates, where the layout, the form theme and the JavaScript belong to the product team. The difference is ownership of the interface. Hand-built screens inherit nothing but conventions, while this bundle ships a complete admin interface and its own frontend stack inside the composer package, with the jQuery plugins and the Stimulus bridge decided for you. For an internal back office that trade pays off; for a product whose design system already exists it does not, and the cheaper route there is to read the documentation site and copy only what fits.
Editorial conclusion
SonataAdminBundle suits teams already on Symfony that accept its pinned interface, AdminLTE 2 on Bootstrap 3 with jQuery 3.7, and want back office screens without writing them. Leave it if your public site already runs a newer Bootstrap, because those constraints are not negotiable through configuration. Before adopting, read docs.sonata-project.org, since the repository documents no install command and no admin class, then check UPGRADE-4.x.md, which every minor step on the default branch depends on.
Frequently asked questions
What does SonataAdminBundle generate, and where is it documented?
The repository description calls it The missing Symfony Admin Generator and the attached topics include admin-generator, but the README holds no usage example, install command or configuration snippet. Practical documentation lives at docs.sonata-project.org, which the README links, and the README itself carries a comment stating it is auto-generated by sonata-project/dev-kit.
What frontend stack does SonataAdminBundle ship in package.json?
The runtime dependencies pin admin-lte to 2.4, bootstrap to 3.3 and jquery to 3.7.0, with select2 at 4.0, x-editable at 1.5 and icheck alongside them. The list also pulls in @hotwired/stimulus and @symfony/stimulus-bridge at 3.2, plus select2-bootstrap-theme at a beta tag, 0.1.0-beta.10.
How do you build the assets and run the linters in the SonataAdminBundle repository?
The build runs through the package.json scripts, where watch and dev-server serve local work and build calls encore production. Linting runs through Makefile targets for Composer metadata, YAML, XML, xliff and PHP, and four lint-symfony targets pass src and tests to bin/console lint:container, lint:twig, lint:xliff and lint:yaml.
Why does the repository name differ from the composer package name?
The repository is called SonataAdminBundle, while the Packagist badges in the README point at sonata-project/admin-bundle. Anyone writing a composer require line needs the package name rather than the repository name, and support questions are directed to a StackOverflow tag for the project.
Which SonataAdminBundle branch should a new project start from?
The default branch is 4.x, and the README tracks 4.x beside 5.x with a separate set of test, coverage and documentation badges for each. The root also carries UPGRADE-4.0.md and UPGRADE-4.x.md, so the 4.0 step and the smaller 4.x steps are tracked as separate upgrade events.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/sonata-project-sonataadminbundle)Was this useful?