PHPackages                             kachnitel/admin-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. [Database &amp; ORM](/categories/database)
4. /
5. kachnitel/admin-bundle

ActiveSymfony-bundle[Database &amp; ORM](/categories/database)

kachnitel/admin-bundle
======================

Modern Symfony admin bundle powered by LiveComponents for Doctrine entities with extensive customization

0.11.0(2mo ago)5426↓82.5%[4 issues](https://github.com/kachnitel/FrdAdminBundle/issues)1MITPHPPHP &gt;=8.4CI failing

Since Dec 4Pushed 2w agoCompare

[ Source](https://github.com/kachnitel/FrdAdminBundle)[ Packagist](https://packagist.org/packages/kachnitel/admin-bundle)[ RSS](/packages/kachnitel-admin-bundle/feed)WikiDiscussions master Synced 4w ago

READMEChangelog (1)Dependencies (64)Versions (30)Used By (1)

Kachnitel Admin Bundle
======================

[](#kachnitel-admin-bundle)

[![Tests](https://camo.githubusercontent.com/61c189f33c4a5d90043ed2c25845726b0fa243757e81d0539774dff1424ab0e0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d313539302532307061737365642d627269676874677265656e)](https://camo.githubusercontent.com/61c189f33c4a5d90043ed2c25845726b0fa243757e81d0539774dff1424ab0e0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d313539302532307061737365642d627269676874677265656e)[![Coverage](https://camo.githubusercontent.com/de967c506e47dd8ffccb90b7c827c474c330bf1522db76fbf268d2ed3fc238ba/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f7665726167652d39332532352d627269676874677265656e)](https://camo.githubusercontent.com/de967c506e47dd8ffccb90b7c827c474c330bf1522db76fbf268d2ed3fc238ba/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f7665726167652d39332532352d627269676874677265656e)[![Assertions](https://camo.githubusercontent.com/9a99045489d476a2bbb91e11550e2049fa866be71b20bae469339e76a0778966/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f617373657274696f6e732d333634322d626c7565)](https://camo.githubusercontent.com/9a99045489d476a2bbb91e11550e2049fa866be71b20bae469339e76a0778966/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f617373657274696f6e732d333634322d626c7565)[![PHPStan](https://camo.githubusercontent.com/17f9c96de70e616ad864f0f6e2863ab37cabfa73b085ed6a2fcdc2c8dddd42a3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d382d627269676874677265656e)](https://camo.githubusercontent.com/17f9c96de70e616ad864f0f6e2863ab37cabfa73b085ed6a2fcdc2c8dddd42a3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d382d627269676874677265656e)[![PHPMD](https://camo.githubusercontent.com/ddd719c8b5eab095bfb7f840c292a313e8188da475f3156783ead131d95c2e95/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048504d442d636c65616e2d627269676874677265656e)](https://camo.githubusercontent.com/ddd719c8b5eab095bfb7f840c292a313e8188da475f3156783ead131d95c2e95/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048504d442d636c65616e2d627269676874677265656e)[![Code Style](https://camo.githubusercontent.com/811b2e1464f638358cea7fb97c26d5eff851c050f123197fc5ec1eab3b265691/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64652532307374796c652d636c65616e2d627269676874677265656e)](https://camo.githubusercontent.com/811b2e1464f638358cea7fb97c26d5eff851c050f123197fc5ec1eab3b265691/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64652532307374796c652d636c65616e2d627269676874677265656e)[![Vitest](https://camo.githubusercontent.com/756b2da76189446b7d0b7f369a25fa2e0b219e39d31363ad2176095e5b162a4b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7669746573742d33302532307061737365642d627269676874677265656e)](https://camo.githubusercontent.com/756b2da76189446b7d0b7f369a25fa2e0b219e39d31363ad2176095e5b162a4b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7669746573742d33302532307061737365642d627269676874677265656e)[![PHP](https://camo.githubusercontent.com/e23f485bc460181b000d13823efa974c3ec1491a539637ad3a4fd5865e183e79/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d2533453d382e342d3737374242343f6c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/e23f485bc460181b000d13823efa974c3ec1491a539637ad3a4fd5865e183e79/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d2533453d382e342d3737374242343f6c6f676f3d706870266c6f676f436f6c6f723d7768697465)[![Symfony](https://camo.githubusercontent.com/bca237fded95b94d7947a4231da294710525ceea77da959f84987fa388eb7294/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53796d666f6e792d253545362e34253743253545372e30253743253545382e302d3030303030303f6c6f676f3d73796d666f6e79266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/bca237fded95b94d7947a4231da294710525ceea77da959f84987fa388eb7294/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53796d666f6e792d253545362e34253743253545372e30253743253545382e302d3030303030303f6c6f676f3d73796d666f6e79266c6f676f436f6c6f723d7768697465)

A modern Symfony admin bundle powered by [LiveComponents](https://symfony.com/bundles/ux-live-component/current/index.html). Add one attribute to your entity and get a full CRUD interface with search, filters, pagination, and batch actions.

**Why another admin bundle?**\#### Motivation I have struggled with keeping my controllers DRY as my applications grew. All my attempts at solving the issue eventually timed perfectly with [Live Components](https://symfony.com/bundles/ux-live-component/current/index.html) growing up into a mature and stable UX system. This bundle is the result of my attempts at previous reusable tables and admin generators, rebuilt on top of Live Components at its core.

While there's excellent admin bundles out there, I felt like defining their configuration replaced my controller problem with a new "configuration problem". I wanted something that was easy to get started with, non-repetitive, but also flexible enough to handle complex use cases while leaning on established patterns.

By leveraging Symfony UX, I was able to create a bundle that provides an admin interface with minimal boilerplate, while still allowing for deep customization through Twig templates and your own components.

Quick Start
-----------

[](#quick-start)

### 1. Install

[](#1-install)

```
composer require kachnitel/admin-bundle
```

### 2. Add attribute to any entity

[](#2-add-attribute-to-any-entity)

```
use Kachnitel\AdminBundle\Attribute\Admin;

#[Admin]
class Product
{
    // Your existing entity...
}
```

### 3. Visit `/admin`

[](#3-visit-admin)

Your entity appears with auto-detected columns, search, filters, and CRUD.

**Manual setup (if not using Symfony Flex)**1. Enable the bundle in `config/bundles.php`, along its two dependency bundles:

```
Kachnitel\DynamicFormBundle\KachnitelDynamicFormBundle::class => ['all' => true],
Kachnitel\EntityComponentsBundle\KachnitelEntityComponentsBundle::class => ['all' => true],
Kachnitel\AdminBundle\KachnitelAdminBundle::class => ['all' => true],
```

2. Import routes in `config/routes/kachnitel_admin.yaml`:

```
kachnitel_admin:
    resource: '@KachnitelAdminBundle/config/routes.yaml'
    prefix: /admin
```

3. Create config in `config/packages/kachnitel_admin.yaml`:

```
kachnitel_admin:
    base_layout: 'base.html.twig'  # Your app's base template
```

What's Next?
------------

[](#whats-next)

**Control Your Columns****Level 1:** Auto-detection (zero config) - all properties shown automatically

**Level 2:** Specify columns and order:

```
#[Admin(columns: ['id', 'name', 'price'])]
```

Or exclude: `excludeColumns: ['costPrice']`

**Level 3:** Role-based visibility:

```
#[ColumnPermission('ROLE_HR')]
private float $salary;
```

**Level 4:** User-toggleable:

```
#[Admin(enableColumnVisibility: true)]
```

**Details:** [Configuration Guide](docs/CONFIGURATION.md#column-configuration) | [Column Visibility](docs/COLUMN_VISIBILITY.md)

**Customize the Look****Level 1:** Use your layout:

```
kachnitel_admin:
    base_layout: 'base.html.twig'
```

**Level 2:** Switch theme (Bootstrap/Tailwind):

```
kachnitel_admin:
    theme: '@KachnitelAdmin/theme/tailwind.html.twig'
```

**Level 3:** Override type templates:

```
templates/bundles/KachnitelAdminBundle/types/datetime/_preview.html.twig

```

**Level 4:** Entity-specific:

```
templates/bundles/KachnitelAdminBundle/types/App/Entity/Product/price.html.twig

```

**Details:** [Template Overrides Guide](docs/TEMPLATE_OVERRIDES.md)

**Add Custom Row Actions****Level 1:** Route-based link, always visible:

```
#[AdminAction(name: 'duplicate', label: 'Duplicate', route: 'app_product_duplicate')]
```

**Level 2:** With a condition (expression):

```
#[AdminAction(name: 'approve', label: 'Approve', condition: 'entity.status == "pending"')]
```

**Level 3:** With a condition (service logic) and confirmation:

```
#[AdminAction(
    name: 'refund',
    label: 'Refund',
    method: 'POST',
    condition: [RefundService::class, 'canRefund'],
    confirmMessage: 'Refund this order?',
)]
```

**Level 4:** Remove or replace default Show/Edit:

```
#[AdminActionsConfig(exclude: ['edit'])]
#[AdminAction(name: 'show', label: 'Preview', icon: '🔍', override: true)]
```

**Details:** [Row Actions Guide](docs/ROW_ACTIONS.md)

**Auto-Generated Forms****Level 1:** Zero config — every `#[Admin]` entity gets New/Edit forms automatically, powered by [`kachnitel/dynamic-form-bundle`](https://github.com/kachnitel/dynamic-form-bundle):

```
#[Admin(label: 'Products')]
class Product { }
// Visit /admin/product/new — fields generated from Doctrine metadata, no FormType written
```

**Level 2:** Hand-written FormType (conventional naming, auto-discovered):

```
// src/Form/ProductFormType.php
class ProductFormType extends AbstractType { /* ... */ }
```

**Level 3:** Custom LiveComponent for extra behaviour (collection management, computed fields):

```
#[AsLiveComponent(name: 'App:Form:PurchaseOrder')]
final class PurchaseOrderForm extends AdminEntityForm { /* ... */ }
```

**Level 4:** Control which fields appear:

```
#[AdminColumn(editable: false)]                        // exclude from the form
#[AdminColumn(editable: 'entity.status != "locked"')]   // conditional
```

**Details:** [Forms Guide](docs/FORMS.md)

**Archive / Soft-Delete Filtering****Level 1:** Point at a boolean field — the list hides archived rows by default, with a toggle to reveal them:

```
#[Admin(label: 'Products', archiveExpression: 'item.archived')]
class Product
{
    private bool $archived = false;
}
```

**Level 2:** Nullable-datetime (soft-delete pattern):

```
#[Admin(archiveExpression: 'item.deletedAt')]
class Order
{
    private ?\DateTimeImmutable $deletedAt = null;
}
```

**Level 3:** Global default for all entities + role-gate the toggle:

```
kachnitel_admin:
    archive:
        expression: 'item.deletedAt'
        role: 'ROLE_ADMIN'
```

**Level 4:** Opt out per entity when a global is configured:

```
#[Admin(label: 'Categories', archiveDisabled: true)]
```

**Details:** [Archive Guide](docs/ARCHIVE.md)

Features
--------

[](#features)

- **Multi-Layer Permissions** - Entity, action, and column-level control
- **Easy start** - Add `#[Admin]` to entity, auto-detects columns
- **Highly Customizable** - From [cell level templates](docs/TEMPLATE_OVERRIDES.md#common-override-scenarios) to entire layout overrides using [Symfony's Twig inheritance](https://symfony.com/doc/current/bundles/override.html#templates)
- **Auto-Generated Forms** - Zero-config create/edit forms from Doctrine metadata via [`kachnitel/dynamic-form-bundle`](https://github.com/kachnitel/dynamic-form-bundle), including associations and collections; drop in a hand-written FormType any time you need more control
- **Inline Editing** - Edit any field in-place, with type-aware inputs and per-column permission guards
- **Column Visibility** - Show/hide columns with session or database-backed preferences
- **Row Actions** — Per-row buttons with conditions, permissions, and priority ordering; extend defaults or replace them
- **Composite Columns** — Group related properties into a single stacked table cell with `#[AdminColumn(group: '...')]`
- **Archive / Soft-Delete** — Hide archived rows by default with a live toggle; works with boolean flags and nullable-datetime fields; no Doctrine filter needed
- **DataSource Abstraction** - Display data from external APIs, audit logs, or any source via [`kachnitel/datasource-contracts`](https://github.com/kachnitel/datasource-contracts)
- **LiveComponent-Powered** - Real-time search, filters, and updates without full page reloads

Documentation
-------------

[](#documentation)

GuideDescription[Configuration](docs/CONFIGURATION.md)Entity attributes and bundle config[Column Visibility](docs/COLUMN_VISIBILITY.md)Permissions and user preferences[Filters](docs/FILTERS.md)Automatic filtering and customization[Row Actions](docs/ROW_ACTIONS.md)Custom action buttons per row — conditions, ordering, providers[Forms](docs/FORMS.md)Auto-generated and custom create/edit forms[Inline Add](docs/INLINE_ADD.md)Create related entities without leaving the current form[Inline Editing](docs/INLINE_EDIT.md)Per-field in-place editing in list views[Composite Columns](docs/COMPOSITE_COLUMNS.md)Group related properties into one stacked table cell[Archive](docs/ARCHIVE.md)Soft-delete / archive filtering with show/hide toggle[Template Overrides](docs/TEMPLATE_OVERRIDES.md)Customize the admin appearance[Batch Actions](docs/BATCH_ACTIONS.md)Multi-select and bulk operations[DataSource](docs/DATASOURCE.md)Non-Doctrine data sources[Assets](docs/ASSETS.md)AssetMapper and Webpack Encore setup[Development](docs/DEVELOPMENT.md)Contributing and running tests[Upgrade Guide](UPGRADE.md)Migrating between major versions**How does this compare to EasyAdmin?**EasyAdmin and SonataAdmin use PHP configuration, while this bundle leans heavily on a single Live Component with Twig templates for customization. This allows for real-time UI updates, and separates configuration (security, columns) from presentation (templates).

**[Full comparison](docs/COMPARISON.md)** - philosophy, features, and when to choose each.

Requirements
------------

[](#requirements)

- PHP 8.4 or higher
- Symfony 6.4 / 7.0 / 8.0
- Doctrine ORM 3.5+
- [`kachnitel/datasource-contracts`](https://github.com/kachnitel/datasource-contracts) (pulled automatically by Composer)
- [`kachnitel/entity-expression-language`](https://github.com/kachnitel/entity-expression-language) (pulled automatically by Composer)
- [`kachnitel/dynamic-form-bundle`](https://github.com/kachnitel/dynamic-form-bundle) (pulled automatically by Composer — licensed MPL-2.0, a file-level copyleft compatible with this bundle's MIT license and with closed-source deployments)

License
-------

[](#license)

MIT License - see [LICENSE](LICENSE) file for details.

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance74

Regular maintenance activity

Popularity20

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 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 ~6 days

Recently: every ~15 days

Total

27

Last Release

89d ago

PHP version history (2 changes)v0.0.0PHP &gt;=8.2

0.5.0PHP &gt;=8.4

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/4067705?v=4)[Ondrej Vana](/maintainers/kachnitel)[@kachnitel](https://github.com/kachnitel)

---

Top Contributors

[![kachnitel](https://avatars.githubusercontent.com/u/4067705?v=4)](https://github.com/kachnitel "kachnitel (319 commits)")

---

Tags

admindoctrinelivecomponentssymfonysymfony-bundlesymfony-uxuxsymfonybundlesymfony-uxdoctrinecrudadminuxlive component

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/kachnitel-admin-bundle/health.svg)

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

###  Alternatives

[easycorp/easyadmin-bundle

Admin generator for Symfony applications

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

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

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

The easy like Crud'it Bundle.

1617.3k14](/packages/2lenet-crudit-bundle)[rcsofttech/audit-trail-bundle

Enterprise-grade, high-performance Symfony audit trail bundle. Automatically track Doctrine entity changes with split-phase architecture, multiple transports (HTTP, Queue, Doctrine), and sensitive data masking.

12017.1k](/packages/rcsofttech-audit-trail-bundle)[kimai/kimai

Kimai - Time Tracking

4.8k9.4k1](/packages/kimai-kimai)[pimcore/pimcore

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

3.8k3.9M532](/packages/pimcore-pimcore)

PHPackages © 2026

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