EasyCorp/EasyAdminBundle
41.1
Weak · 19 September 2026
31.8k
lines of production code
PHP
with JavaScript
1
measurement over time
What this system is
This system is the EasyAdmin bundle, a Symfony package that generates fully functional admin panels for managing Doctrine entities. It provides a configuration-driven API to define dashboards, CRUD controllers, and granular UI elements like fields, filters, and actions. The bundle handles the underlying routing, security, form rendering, and data persistence, exposing a modern, component-based interface with support for dark mode and AI coding agent integration.
How it got here
2015–2020 — EasyAdmin 5.x architecture and UI overhaul
43 changes.
This period established the foundational architecture for EasyAdmin 5.x, featuring a complete rewrite of the dependency injection, configuration, and exception handling systems. It introduced a modernized Bootstrap 5-based interface with dark mode support, alongside new form field types, AI coding agent integration, and robust testing infrastructure.
2021–2026 — EasyAdmin 5 architecture and component rewrite
91 changes.
This period focused on the foundational rewrite of EasyAdmin 5, introducing a modern component-based UI architecture using Twig components and Bootstrap 5.3. It established new PHP contracts for routing, context, and factories, while migrating service configuration to PHP. The work also included comprehensive functional and unit testing to validate the new features, security models, and internationalization support.
Features
Add EasyAdmin profiler panel and icons
A new data collector template has been added to display EasyAdmin-specific information in the Symfony Web Profiler. The panel shows the EasyAdmin version and a table of collected data for requests related to EasyAdmin, while indicating when a route is not related to the bundle. Two SVG icon templates (legacy and v3) are included to support different profiler markup versions.
templates/inspector · high confidence
Added DynamicChoiceLoader for dynamic form options
A new DynamicChoiceLoader class has been introduced in the form choice list system to enable the dynamic addition of options to select inputs. This loader implements ChoiceLoaderInterface and manages a list of choices, caching the resulting ArrayChoiceList to optimize performance when the underlying values remain unchanged.
src/Form/ChoiceList · high confidence
Added TypeScript type definitions for EasyAdmin events
A new \assets/types.d.ts\ file has been added to provide TypeScript type definitions for EasyAdmin's custom DOM events. This allows TypeScript users to get proper type checking and autocompletion for events such as \ea.autocomplete.connect\, \ea.collection.item-added\, and \ea.form.submit\, improving the developer experience when integrating with these components.
assets · high confidence
Added internal utilities for pagination and theme color contrast
This change introduces two new internal utility classes in src/Util. PageRangeCalculator provides logic to determine which page numbers to display in a paginator, including handling gaps (ellipsis) based on the current page and total pages. ThemeColorCalculator computes the appropriate foreground color (black or white) for a given background color to ensure WCAG-compliant contrast, supporting hex, rgb, hsl, and oklch color formats. These utilities support the underlying infrastructure for pagination display and theme-based styling.
src/Util · high confidence
Added maintenance scripts for asset manifest, CSS linting, and flag icons
Three new CLI scripts have been added to the build tooling to improve asset management and code quality. The \fix-assets-manifest-file.php\ script corrects \manifest.json\ entries and CSS font paths to ensure assets load correctly when the application is served from a subdirectory. The \logical-css-properties-linter.php\ script scans CSS files for non-logical properties (e.g., \margin-left\ instead of \margin-inline-start\) to support internationalization and RTL layouts. The \update-flag-icons.php\ script automates the download and preparation of country flag SVGs for the new Twig flag component.
src/Resources/bin · high confidence
Initial release of EasyAdmin 5.6.1
The EasyAdminBundle is introduced as a new Symfony bundle class, establishing the foundation for version 5.6.1 in development. This change adds the core bundle entry point, defining the namespace \EasyCorp\\Bundle\\EasyAdminBundle\ and implementing the \getPath\ method to correctly resolve the bundle's directory structure relative to its class file.
src · high confidence
Initial repository scaffolding and configuration for EasyAdmin 5.x
The repository has been initialized with the foundational configuration files required for the EasyAdmin 5.x branch. This includes a Makefile for build and test automation, a .gitattributes file to manage export-ignores for development artifacts, and a .gitignore file to exclude local environment files. Code quality is enforced via php-cs-fixer (configured with Symfony rules and specific overrides like protected\_to\_private), PHPStan (level 6), and Biome for JavaScript/CSS linting. Frontend assets are managed through Webpack Encore, with a webpack.config.js defining entry points for various UI components. Additionally, a .phpstorm.meta.php file is provided to improve IDE autocompletion for Symfony service injection, and a .symfony.bundle.yaml file registers the bundle for Symfony's ecosystem tools. The project also introduces AGENTS.md to guide AI coding assistants and updates the README and UPGRADE documentation to reflect the new architecture and requirements (PHP 8.2+, Symfony 6.4/7.x/8.x).
(repo-wide) · high confidence
Introduce AdminContextProviderInterface for context retrieval
A new AdminContextProviderInterface contract is added to the Provider contracts namespace, defining a getContext method that returns the AdminContextInterface. This provides a standardized way for services to retrieve the current admin context object via dependency injection.
src/Contracts/Provider · high confidence
Introduce AdminControllerRegistryInterface for unified dashboard and CRUD controller management
A new interface, AdminControllerRegistryInterface, has been added to define a unified registry for Dashboard and CRUD controllers. This interface provides methods to retrieve route names and fully qualified class names (FQCNs) for registered dashboards and CRUD controllers, including capabilities to find controllers by entity, retrieve all registered controllers, and access the first registered dashboard. This establishes the contract for managing admin controller registrations within the EasyAdmin bundle.
src/Contracts/Registry · high confidence
Introduces EntityLifecycleEventInterface for entity access
A new interface, EntityLifecycleEventInterface, has been added to the event contracts. This interface defines a getEntityInstance method that returns the affected entity object, providing a standardized way for lifecycle event listeners to access the entity instance involved in the event.
src/Contracts/Event · high confidence
Introduces centralized registries for controllers and templates
The application now uses dedicated registry classes to manage core configuration. AdminControllerRegistry provides a unified, cached mapping between dashboard/CRUD controllers and their routes, as well as between CRUD controllers and their associated entities. TemplateRegistry centralizes the definition of all EasyAdmin Twig templates, allowing the system to look up template paths by name and enabling users to override specific templates (such as layout, CRUD views, or individual field types) via a simple API.
src/Registry · high confidence
Introduces internal file-upload state and Flysystem DTO models
Added FileUploadState and FlysystemFile classes to the form type model layer to support file uploading. FileUploadState manages the lifecycle of file uploads (current, uploaded, and deleted files) and exposes whether additions or deletions are allowed, while FlysystemFile provides a lightweight DTO that mimics Symfony's File interface for files stored in remote filesystems via Flysystem, ensuring templates and form types can access path, filename, and size information consistently.
src/Form/Type/Model · high confidence
Introduction of AdminRouteGeneratorInterface for route generation
A new interface, AdminRouteGeneratorInterface, has been added to the router contracts to define the contract for generating all routes for EasyAdmin dashboards and CRUD controllers. This interface specifies methods for generating the full route collection, finding specific route names by dashboard/controller/action, and retrieving dashboard-specific routes, establishing the foundation for the application's routing logic.
src/Contracts/Router · high confidence
Introduction of IntlFormatterInterface for currency and number formatting
A new IntlFormatterInterface has been added to the contracts layer, defining methods for formatting currency, numbers, dates, and times. This interface standardizes the contract for internationalization formatting services, allowing implementations to provide consistent behavior for amount and number presentation across the application.
src/Contracts/Intl · high confidence
Introduction of dedicated field classes for form configuration
The \src/Field\ directory now contains a comprehensive set of dedicated field classes (such as \ArrayField\, \AssociationField\, \AvatarField\, \BooleanField\, \ChoiceField\, \CollectionField\, \CountryField\, \CurrencyField\, \DateField\, \DateTimeField\, \EmailField\, \FileField\, and others) that implement \FieldInterface\. These classes provide a fluent API for configuring specific form field behaviors, including options for autocomplete, badge rendering, native widgets, CRUD form embedding, and validation constraints. This change establishes the concrete configuration layer for the form fields used in the application.
src/Field · high confidence
Introduction of new AbstractCrudController and AbstractDashboardController for EasyAdmin 4
The \src/Controller\ area now provides the foundational controller classes for the EasyAdmin 4 admin panel. \AbstractCrudController\ replaces the previous implementation, introducing a configuration-driven approach using dedicated Config objects (Crud, Actions, Assets, Filters) and Factory classes (ActionFactory, EntityFactory, etc.) to manage CRUD operations, field rendering, and security permissions. It also introduces a new \AdminContext\ and \KeyValueStore\ for passing data to views. \AbstractDashboardController\ simplifies dashboard setup by providing default menu items, user menu configuration (including logout and impersonation exit), and default CRUD actions, while rendering a new welcome page for empty dashboards.
src/Controller · high confidence
Introduction of typed configuration option constants
The configuration API in src/Config/Option now replaces magic strings with strongly-typed constants for various settings. This includes options for cache keys, click triggers (single/double), color schemes (light/dark/auto), icon sets (FontAwesome, custom, internal), file replacement behaviors, search modes (any/all terms), UI sizes, sort orders, text alignment, and text direction. Users can now reference these constants (e.g., ColorScheme::DARK, SearchMode::ALL\_TERMS) instead of hardcoding string values, improving code safety and IDE autocomplete support.
src/Config/Option · high confidence
New \#\[AdminDashboard\] and \#\[AdminRoute\] attributes for route configuration
This release introduces two new PHP attributes to configure admin routing: \#\[AdminDashboard\] and \#\[AdminRoute\]. The \#\[AdminDashboard\] attribute allows developers to define the base route path, name, and options for an admin dashboard, as well as control which CRUD controllers are included via allowed or denied lists. The \#\[AdminRoute\] attribute provides granular control over individual action routes, enabling customization of paths, names, and additional Symfony route options, while also supporting dashboard-level access restrictions through allowed and denied dashboard lists.
src/Attribute · high confidence
New AI coding agent skill installation and example entities
This update introduces a new capability to install and manage EasyAdmin skills for AI coding agents (Claude Code, Cursor, Windsurf, etc.) via the new \src/Ai/\ classes, and adds example Doctrine entities (\BlogArticle\, \Category\, \ContentBlock\) in the \.ddev/example\ directory to demonstrate usage.
easycorp/easyadmin-bundle · high confidence
New AdminContextInterface defines the admin dashboard contract
A new AdminContextInterface has been introduced in the Contracts/Context namespace, establishing the official API for accessing admin dashboard state. This interface exposes methods for retrieving request data, user information, CRUD and search configurations, and crucially, introduces a theming API via methods like getDashboardTheme(), getDashboardHasDarkModeEnabled(), and getDashboardDefaultColorScheme(). It also includes access to the new AdminControllerRegistryInterface, dashboard layout settings (content/sidebar width), and asset management, serving as the central contract for the admin context.
src/Contracts/Context · high confidence
New ArrayField and enhanced ChoiceField rendering
The admin interface now supports an ArrayField, which renders Doctrine PersistentCollection values as comma-separated strings on the index page and allows adding or deleting entries in forms. Additionally, ChoiceField rendering has been improved to support displaying choices as badges, handling translatable enum choices correctly, and allowing preferred choices to be defined.
src/Field/Configurator · high confidence
New DDEV-based development environment for EasyAdmin 5.x
This change introduces a complete example application configured for local development via DDEV, specifically tailored for EasyAdmin 5.x. It includes a functional admin dashboard with menu items linking to Blog Article and Category management pages, demonstrating features such as collection fields, entity filters, and custom form types within the EasyAdmin interface.
.ddev/example · high confidence
New EasyAdmin Twig extension with context injection and utility filters
The \src/Twig/EasyAdminTwigExtension.php\ file introduces a new Twig extension that injects the admin context as a global \ea\ variable and provides several utility functions and filters. Users can now access the admin context via the \ea()\ function and generate URLs using \ea\_url()\. New filters include \ea\_flatten\_array\ for handling nested form data, \ea\_filesize\ for formatting file sizes, \ea\_as\_string\ for representing values, \ea\_html\_attrs\ for processing HTML attributes with translation support, \ea\_filetype\_icon\ for determining file type icons, and \ea\_force\_download\ to prevent stored XSS by forcing downloads for executable file types. A new test \ea\_is\_not\_empty\ is also available to safely check values without triggering deprecation warnings.
src/Twig · high confidence
New EasyAdmin data collector for request profiling
A new \EasyAdminDataCollector\ class has been added to collect and display information about EasyAdmin requests in the Symfony web debug toolbar and profiler. It gathers details such as the CRUD controller class, action, entity ID, and sort parameters from the admin context, allowing users to inspect EasyAdmin-specific request data during development.
src/DataCollector · high confidence
New ORM pagination and DQL escaping utilities
Added src/Orm/EntityPaginator.php to provide a robust pagination implementation for Doctrine ORM queries, including support for HAVING conditions, configurable page ranges, and result range indicators (e.g., "Showing 21 to 40 of 135 entries"). Also added src/Orm/Escaper.php to handle DQL reserved keyword escaping, ensuring entity names used as aliases do not conflict with Doctrine keywords, with compatibility for both older and newer Doctrine lexer versions.
src/Orm · high confidence
New Twig UI components and design system guidelines
This release introduces a suite of new class-backed Twig components for the EasyAdmin UI, including Alert, Badge, Button, Flag, Icon, and Pagination, alongside a new AGENTS.md file that establishes the conventions for building future components. These components are designed to support a shadcn/ui-like design system built on global design tokens (such as shared radius and size scales) rather than one-off styles, and they utilize the Symfony UX TwigComponent library with explicit service registration. The Button component includes a migration layer to handle the deprecated 'htmlAttributes' prop, while the Flag component adds SVG rendering with caching and path traversal protection.
src/Twig/Component · high confidence
New Twig UI components for actions, modals, sidebar, and pagination
The templates/components directory now includes a comprehensive suite of new Twig components to replace legacy rendering logic. This adds an ActionMenu system (with sub-components for lists, items, dividers, headers, and checkbox/radio groups) to support grouped actions and dropdowns, a Modal component with Trigger and Close helpers for Bootstrap-based dialogs, a Sidebar component with structured content, footer, and item groups, and a Pagination component for list navigation. Additionally, new components are provided for Alerts, Badges, Buttons (supporting link, form, and button variants), Flags, Icons (with UX icon fallback), Switches, and Tabs, standardizing the visual design and accessibility of the backend interface.
templates/components · high confidence
New commands to generate admin controllers and install AI coding agent skills
This release introduces three new console commands in the src/Command directory to streamline admin setup and AI integration. The \make:admin:dashboard\ command generates a new Dashboard controller class, while \make:admin:crud\ generates CRUD controllers for existing Doctrine entities, allowing users to specify custom directories and namespaces. Additionally, \easyadmin:ai:install\ and \easyadmin:ai:update\ commands allow users to install and maintain EasyAdmin skills for AI coding agents (such as Claude or GitHub Copilot), including optional updates to AI instruction files like CLAUDE.md.
src/Command · high confidence
New controller interfaces for dashboard and CRUD operations
Introduced \DashboardControllerInterface\ and \CrudControllerInterface\ to define the contract for backend dashboards and CRUD controllers. These interfaces standardize configuration methods (such as \configureDashboard\, \configureCrud\, \configureActions\, \configureFilters\, and \configureAssets\) and CRUD lifecycle methods (including \index\, \detail\, \edit\, \new\, \delete\, and \autocomplete\), along with form creation and entity persistence/update operations, providing a structured contract for implementing admin panels.
src/Contracts/Controller · high confidence
New event system for CRUD actions and entity lifecycle
The \src/Event\ directory now contains a new set of event classes that allow developers to hook into the EasyAdmin lifecycle. This includes \BeforeCrudActionEvent\ and \AfterCrudActionEvent\ for intercepting CRUD actions, with the latter allowing custom response parameters to be passed to templates. Additionally, \BeforeEntityPersistedEvent\, \AfterEntityPersistedEvent\, \BeforeEntityUpdatedEvent\, \AfterEntityUpdatedEvent\, \BeforeEntityDeletedEvent\, and \AfterEntityDeletedEvent\ provide granular control over entity persistence, updates, and deletion. These events extend \AbstractLifecycleEvent\ or use \StoppableEventTrait\, enabling users to stop propagation and return custom responses.
src/Event · high confidence
New factory interfaces for entity and menu creation
The system now exposes explicit contracts for creating and managing entities and menus. The new EntityFactoryInterface defines methods to create entity DTOs from class names or instances, build entity collections, and retrieve Doctrine metadata. The new MenuFactoryInterface provides methods to construct the main dashboard menu and the user-specific action menu, handling the processing of menu item lists into their respective DTOs.
src/Contracts/Factory · high confidence
New form data transformers for Money and file uploads
Added two new data transformers to the form layer: MoneyToNumericTransformer converts between Money objects and numeric values for currency fields, and StringToFileTransformer handles file uploads by validating paths for security (rejecting unsafe characters and directory traversal) and supporting both local and Flysystem storage backends.
src/Form/DataTransformer · high confidence
New form layout types for tabs, columns, and fieldsets
Added new internal form type classes in src/Form/Type/Layout to support structured form layouts, including EaFormTabListType, EaFormTabPaneOpenType, and EaFormRowType for tabbed interfaces; EaFormColumnOpenType and EaFormColumnGroupOpenType for column-based layouts; and EaFormFieldsetOpenType for grouped fields. These types allow developers to organize form elements into tabs, columns, or fieldsets with support for options like CSS classes, icons, help text, and collapsibility.
src/Form/Type/Layout · high confidence
New form types and enhanced filter/autocomplete capabilities
This release introduces several new form types to expand field options: CodeEditorType and TextEditorType (based on Trix) for rich text and code input, SlugType for automatic URL slugs, and EaMoneyType to support Money\\Money objects. The existing autocomplete functionality (CrudAutocompleteType) now supports grouping entries via a new 'group\_by' option and allows customizing the label of selected items with 'choice\_label'. File uploads are handled by a new FileUploadType that supports Flysystem storage, multiple file uploads, and configurable behavior for replacing existing files. Additionally, the filtering system is significantly expanded with a new ComparisonType that adds 'contains all' support for arrays, 'between' support for numeric and datetime fields, and improved handling of embedded properties in FiltersFormType.
src/Form/Type · high confidence
New interface for generating translation IDs
Added the EntityTranslationIdGeneratorInterface contract in the Translation contracts package, defining methods to generate translation IDs for both entities and their specific properties.
src/Contracts/Translation · high confidence
New interface for runtime action modification
Added the ActionsExtensionInterface contract, which defines the supports and extend methods required for services that modify EasyAdmin actions at runtime.
src/Contracts/Action · high confidence
Refactored menu items into dedicated classes with badge and permission enhancements
The menu configuration system has been refactored to use specific classes for each menu item type (such as CrudMenuItem, UrlMenuItem, and RouteMenuItem) instead of generic builders. This change introduces a new badge feature, allowing developers to display count badges on menu items via the setBadge method, and expands permission support to accept Symfony ExpressionLanguage expressions in addition to simple strings, enabling more dynamic access control for menu visibility.
src/Config/Menu · high confidence
Support for entity and property translation keys with parameter merging
Users can now define specific translation keys for entities and their properties, enabling more granular control over UI labels. This is powered by the new EntityTranslationIdGenerator, which creates structured keys (e.g., entities.{entity}.{singular\|plural} and entities.{entity}.properties.{property}), and the TranslatableMessageBuilder, which allows merging translation parameters into existing TranslatableMessage objects to support dynamic content in translations.
src/Translation · high confidence
API
New Orm contract interfaces for pagination, repository, updates, and associations
The Orm contract layer now exposes four new interfaces that define the public API for core data operations. EntityPaginatorInterface standardizes pagination behavior, including a new getResultsAsJson method that supports future customization of JSON output and grouping. EntityRepositoryInterface defines how search queries are built using search, entity, field, and filter DTOs. EntityUpdaterInterface provides a contract for updating specific entity properties. NestedAssociationResolverInterface handles the resolution of complex property paths across associations, automatically managing JOIN clauses in queries.
src/Contracts/Orm · high confidence
Architecture
New PHP-based service container configuration for EasyAdmin
The bundle's service definitions have been migrated to a new \config/services.php\ file, replacing the previous XML/YAML configuration format. This change introduces explicit wiring for core components including the new AI skill commands (\InstallAiSkillCommand\, \UpdateAiSkillCommand\), modern Twig components (Alert, Badge, Button, Flag, Icon, Pagination), and updated form type extensions. It also registers the \EasyAdminDataCollector\ for debugging and establishes the \AdminControllerRegistry\ and \AdminContextProvider\ as central service locators, ensuring the backend's dependency injection structure aligns with modern Symfony practices.
config · high confidence
New typed collection classes for actions, entities, fields, and filters
The \src/Collection\ directory now introduces four new final collection classes—\ActionCollection\, \EntityCollection\, \FieldCollection\, and \FilterCollection\—which replace previous array-based handling with structured, type-safe containers. These classes implement standard PHP interfaces (\ArrayAccess\, \Countable\, \IteratorAggregate\) and provide specific methods for managing their respective DTOs (e.g., \getGlobalActions\, \getByProperty\, \first\). This change standardizes how actions, entities, fields, and filters are stored and accessed internally, improving code maintainability and type safety within the EasyAdmin bundle.
src/Collection · high confidence
Refactored AdminContext into specialized sub-contexts
The monolithic AdminContext has been decomposed into focused sub-contexts (RequestContext, CrudContext, DashboardContext, and I18nContext) to better organize admin state. This change improves code maintainability and testability by isolating concerns such as HTTP request data, CRUD operation state, dashboard configuration, and internationalization, while the main AdminContext now acts as a facade delegating to these specialized components.
src/Context · high confidence
Behavioural changes
CRUD templates rewritten to use Twig components and modern asset handling
The CRUD page templates (index, new, edit, detail) have been completely rewritten to use the new \ea()\ Twig function instead of the global \ea\ variable, and now render actions via the \twig:ea:Button\ and \twig:ea:ActionMenu\ components. This change introduces support for Content Security Policy (CSP) nonces on form scripts, adds support for Symfony Reprise assets, and allows customization of the default row action trigger and entity row attributes on the index page.
templates/crud · high confidence
CSS architecture overhaul with cascade layers and new form editor styles
The CSS styling system has been restructured to use CSS cascade layers, ensuring that backend application styles can reliably override EasyAdmin defaults regardless of specificity or load order. This change introduces dedicated styles for the new CodeEditor and TextEditor form types, including specific fixes for disabled states in the text editor and proper theming support for the Trix toolbar. Additionally, the stylesheet now imports Bootstrap 5.3 and FontAwesome, replacing the previous Sass-based setup with a pure CSS approach.
assets/css · high confidence
Centralized security logic with a new SecurityVoter and Permission constants
The security model has been refactored to use a dedicated SecurityVoter that centralizes access control for EasyAdmin operations. A new Permission class defines specific constants (EA\_ACCESS\_ENTITY, EA\_EXECUTE\_ACTION, EA\_VIEW\_MENU\_ITEM, EA\_VIEW\_FIELD, EA\_EXIT\_IMPERSONATION) to standardize permission checks. The voter now explicitly handles permissions for viewing menu items, executing CRUD actions (checking both disabled status and specific action permissions), viewing fields, accessing entities, and exiting impersonation, replacing scattered isGranted calls with a unified, cacheable voter implementation.
src/Security · high confidence
Complete template rewrite with Twig components and CSP support
The templates directory has been completely rewritten to use new Twig components (Sidebar, ActionMenu, Badge, Alert, Icon) and a modern bundle structure. This introduces a theming API, Content Security Policy (CSP) nonce support for assets and inline scripts, and a new standalone exception page. Flash messages are now rendered via a dedicated component, and the welcome page has been updated to reflect EasyAdmin 5.
templates · high confidence
EasyAdmin 2.x default theme overhaul with CSS-only theming
The EasyAdmin 2.x default theme has been completely rewritten in plain CSS, removing the previous Sass dependency. This update introduces a robust theming API based on CSS custom properties (design tokens), allowing the entire backend to be re-themed by changing a few variables. The new design system, inspired by shadcn/ui, ensures consistent spacing, typography, and colors across all components, including datagrids, forms, buttons, and alerts. It also brings improved dark mode support, better responsive behavior, and more accessible focus indicators.
assets/css/easyadmin-theme · high confidence
Improved autocomplete ID handling and form layout error indicators
The CrudAutocompleteSubscriber now correctly handles UUID and ULID identifiers, including arrays of IDs and native GUID database platforms, ensuring accurate data mapping during form submission. Additionally, the new FormLayoutSubscriber automatically expands collapsed fieldsets that contain validation errors and highlights the first tab with errors, improving the user experience when correcting form input mistakes.
src/Form/EventListener · high confidence
IntlFormatter now translates date formats to the current locale
The IntlFormatter component now automatically translates date format strings (such as 'short', 'medium', 'long', 'full') into the corresponding ICU patterns for the active locale. Previously, these keywords were mapped directly to PHP's IntlDateFormatter constants, which often resulted in English-style date patterns regardless of the user's locale. This change ensures that date formatting respects local conventions, providing a more natural experience for users in different regions.
src/Intl · high confidence
Introduction of Pretty URLs and new AdminRoute attribute
The router now supports 'pretty URLs' by default, generating cleaner route paths (e.g., \/new\ instead of query-string-based URLs) and using kebab-case for route names. This change introduces the \\#\[AdminRoute\]\ attribute for defining custom admin routes and replaces the previous URL signature mechanism with signed URLs by default. The \AdminUrlGenerator\ now supports generating relative URLs and allows using \id\ as an alias for \entityId\. Additionally, the router automatically redirects from old 'ugly' URLs to the new pretty URL format to ensure backward compatibility.
src/Router · high confidence
Migrated dependency injection configuration from XML to PHP
The EasyAdmin bundle's service configuration has been moved from XML files to a PHP-based definition (services.php), loaded via the new EasyAdminExtension. This change introduces autoconfiguration for specific interfaces (DashboardControllerInterface, CrudControllerInterface, FieldConfiguratorInterface, FilterConfiguratorInterface, ActionsExtensionInterface) to automatically apply relevant tags, and registers the AdminRoute attribute to automatically tag controllers. Additionally, the extension now pre-configures Twig component defaults and template paths for the bundle.
src/DependencyInjection · high confidence
Modernized asset rendering with CSP nonce support and new asset integrations
The template includes for CSS and JavaScript assets have been rewritten to support modern Symfony asset features and improved security. HTML attributes are now explicitly escaped using the 'html' filter to prevent injection issues. Content Security Policy (CSP) nonces are automatically injected into all generated link and script tags, with conditional logic to handle environments where CSP is not enabled. The templates now support preloading assets via the new 'preload' guard function and integrate with Symfony Reprise for asset management. Additionally, new templates for Webpack Encore and Importmap are provided, utilizing their respective guard functions to ensure compatibility with these asset systems.
templates/includes · high confidence
Modular detail page layout templates for easier customization
The detail page rendering in EasyAdmin has been refactored to expose individual layout components as separate, overridable Twig templates. This change introduces dedicated templates for structural elements such as tab lists, tab panes, column groups, columns, and fieldsets (e.g., \tab\_list.html.twig\, \column\_open.html.twig\, \fieldset\_open.html.twig\). By breaking down the detail view into these granular parts, users can now selectively override specific sections of the page layout without needing to replace the entire detail template, providing greater flexibility in customizing the appearance and structure of entity detail views.
templates/crud/detail · high confidence
New DDEV commands for asset building, testing, and environment setup
The DDEV web commands have been updated to streamline the development workflow for the EasyAdminBundle. A new 'ddev make' command acts as a wrapper to execute Makefile targets within the bundle directory. The existing 'ddev build-assets' and 'ddev run-tests' commands are now deprecated in favor of 'ddev make build-assets' and 'ddev make tests' respectively, providing clearer guidance to users. Additionally, a 'ddev setup' command has been introduced to automate the initialization of the Symfony 8.0 skeleton, configure the local EasyAdminBundle as a path repository, symlink example entities and controllers, and initialize the database. A basic shell alias for listing files has also been added to the developer environment.
.ddev/commands · high confidence
New DTO classes for actions, assets, and CRUD configuration
The \src/Dto\ directory now includes a comprehensive set of new Data Transfer Objects to manage backend configuration and state. \ActionConfigDto\ and \ActionDto\ (along with \ActionGroupDto\) handle the definition, permissions, and rendering details of CRUD actions, including support for Symfony Expressions in permissions. \AssetsDto\ and \AssetDto\ centralize the management of CSS, JavaScript, Webpack Encore, and Symfony Reprise assets, allowing them to be loaded conditionally per page. \CrudDto\ aggregates these settings along with entity labels, sorting, search modes, and form options, while \DashboardDto\ manages global dashboard settings like themes, color schemes, and layout widths. Additional DTOs such as \EntityDto\, \FieldDto\, \FilterDto\, and \MenuItemBadgeDto\ provide structured data for entities, form fields, filters, and menu badges, replacing previous ad-hoc structures.
src/Dto · high confidence
New Field contract interfaces for configuration and trait-based implementation
The \src/Contracts/Field\ directory now introduces three new interfaces to structure field definitions: \FieldInterface\ defines the core field contract including constants for prepend/append options and cloning; \FieldConfiguratorInterface\ specifies how field DTOs are supported and configured against entity and admin contexts; and \FieldTraitAwareInterface\ exposes the full set of fluent configuration methods (such as styling, visibility, and form type settings) that are implemented via \FieldTrait\. These interfaces establish the API surface for field configuration and customization within the EasyAdmin bundle.
src/Contracts/Field · high confidence
New confirmation and filter modals using Twig components
The backend now uses dedicated Twig components (ea:Modal, ea:Button) to render action confirmation dialogs, batch action modals, and filter overlays. This introduces a consistent UI for confirming destructive actions (with CSRF protection), executing batch operations, and applying filters, replacing previous inline or JavaScript-based implementations with structured, reusable modal templates.
templates/crud/includes · high confidence
New dedicated configurators for specific filter types
The filter configuration logic has been refactored to use dedicated configurator classes for each filter type, replacing the previous monolithic approach. This change introduces specific configurators for Choice, Comparison, Country, Currency, DateTime, Language, Locale, Null, Numeric, Text, and Timezone filters. These new classes handle type-specific setup, such as mapping Doctrine field types to appropriate Symfony form types (e.g., DateType for date fields, IntegerType for integers) and configuring internationalized choice lists for countries, currencies, languages, locales, and timezones using the Symfony Intl component. This structure allows for more precise control over how each filter type behaves and is configured within the admin interface.
src/Filter/Configurator · high confidence
New filter configuration and implementation contracts
The filter system now introduces two new interfaces to structure how filters are configured and applied. FilterConfiguratorInterface allows external code to determine if a filter applies to a specific field and to modify its configuration settings before it is used. FilterInterface, which now extends Stringable, defines the contract for filters that apply logic to database queries and provide their own data transfer object representation.
src/Contracts/Filter · high confidence
New menu item contract interfaces introduced
The menu system now exposes two new interfaces in the contracts layer: MenuItemInterface, which defines a method to convert a menu item into a DTO, and MenuItemMatcherInterface, which provides a method to identify and mark the currently selected menu item based on the HTTP request. These interfaces standardize how menu data is structured and how selection logic is applied within the admin panel.
src/Contracts/Menu · high confidence
New structured exception hierarchy with public/debug message separation
The exception handling in src/Exception has been rewritten to use a new BaseException class that wraps an ExceptionContext, allowing distinct public (safe for users) and debug (internal) messages, status codes, and parameters. New specific exceptions include EntityNotFoundException (404), EntityRemoveException (409 with previous exception context), ForbiddenActionException (403), and InsufficientEntityPermissionException (403), all extending BaseException. A custom FlattenException now preserves this context for Symfony error pages. InvalidEntityException remains a RuntimeException but now explicitly carries ConstraintViolationListInterface violations.
src/Exception · high confidence
Redesigned configuration API with new Action, Theme, and Dashboard classes
The configuration layer for the EasyAdmin backend has been completely rewritten to support a modern, fluent API. Users can now define granular actions and action groups (including split buttons and dropdowns) via the new \Action\ and \ActionGroup\ classes, and manage their visibility, permissions, and ordering through the \Actions\ config. The \Dashboard\ class now exposes methods to customize the default color scheme (light/dark/auto), toggle dark mode, and configure layout density. A new \Theme\ class allows deep visual customization of the interface, including primary colors, border radius, spacing, and gray scales. Additionally, the \MenuItem\ class has been updated to support linking to any controller, and a new \KeyValueStore\ utility simplifies handling nested configuration data.
src/Config · high confidence
Redesigned form layout and field configuration system
The form rendering engine has been refactored to support a more structured and flexible interface. A new FormLayoutFactory now automatically manages form structures like tabs, fieldsets, and columns, ensuring that all fields are correctly nested and validating layout rules (e.g., preventing tabs inside columns). The FieldFactory now intelligently guesses specific field types (such as AssociationField or CollectionField) from generic Field definitions based on Doctrine metadata, and automatically hides form-row layout elements on index and detail pages. Additionally, the FilterFactory provides automatic filter type guessing based on database column types, simplifying filter configuration for users.
src/Factory · high confidence
Redesigned interface with Bootstrap 5, dark mode, and new field types
The backend interface has been redesigned to use Bootstrap 5, introducing a new dark mode design and a responsive layout. The autocomplete functionality has been replaced with TomSelect, and new form field types have been added for code editing (CodeMirror), file uploading, and text editing (Trix). The JavaScript architecture has been modernized by removing jQuery dependencies, and the application now exposes global variables for Bootstrap and Trix to support custom backend pages.
assets/js · high confidence
Refactored CRUD field templates to use Twig components and modern rendering patterns
The templates in the \templates/crud/field\ directory have been completely rewritten to adopt a new component-based architecture. Field rendering now relies on dedicated Twig components (such as \ea:Badge\, \ea:Switch\, \ea:Icon\, and \ea:Button\) and the \ea()\ global function, replacing the previous reliance on the deprecated \ea\ global variable. This change introduces new visual behaviors, including the display of boolean values as badges or interactive switches, the rendering of country and currency fields with flag and badge components, and the use of modals for viewing code editor and text editor content. Additionally, security and escaping have been improved across fields like Color, Email, and Telephone, and the \nl2br\ filter has been removed in favor of explicit HTML handling.
templates/crud/field · high confidence
Refactored filter form types with new Array, Boolean, Choice, Entity, and Null filter implementations
The filter system in src/Form/Filter has been restructured with new dedicated form types for handling different data categories. ArrayFilterType now supports 'contains all' comparisons and uses a dynamic choice loader for values, while ChoiceFilterType handles both single and multiple selection modes with appropriate SQL operators (IN/NOT IN vs =/!=) and manages autocomplete widget attributes based on whether the choices are expanded. BooleanFilterType provides radio button selection for true/false values, EntityFilterType configures entity selection with autocomplete disabled by default, and NullFilterType offers expanded choice options for null checks. These changes improve how users filter records by ensuring correct comparison logic and UI behavior for each data type.
src/Form/Filter · high confidence
Refactored filter system with new dedicated filter classes and improved null handling
The filter implementation in src/Filter has been completely rewritten to use a new set of dedicated filter classes (ArrayFilter, BooleanFilter, ChoiceFilter, ComparisonFilter, CountryFilter, CurrencyFilter, DateTimeFilter, EntityFilter, LanguageFilter, LocaleFilter, NullFilter, NumericFilter, TextFilter, and TimezoneFilter) that share a common FilterTrait. This refactor introduces several behavioral improvements: the EntityFilter now supports autocomplete and correctly handles Symfony UIDs (Uuid/Ulid) for custom Doctrine types; the NumericFilter properly accounts for MoneyField's stored-as-cents configuration; the DateTimeFilter and NullFilter now correctly handle null values in comparisons; and the ArrayFilter supports a 'contains all' comparison mode. Additionally, ChoiceFilter and its specialized variants (Country, Currency, Language, Locale, Timezone) now support translatable choices and multiple selection.
src/Filter · high confidence
Restructured page templates with CSP nonce support and new login form
The page templates have been reorganized into dedicated files (content.html.twig, login.html.twig, and login\_minimal.html.twig) to improve customization and maintainability. The login form now uses a new Button component and supports customizable labels and footer blocks. Additionally, Content Security Policy (CSP) nonce support has been added to the login and minimal login templates, ensuring scripts and styles can be injected securely when strict CSP policies are enforced.
templates/page · high confidence
Support for custom input addons and fixed collection form rendering
Form fields can now display custom text, HTML, or icons before and after the input element via the new prepend and append options, which are automatically merged with default symbols like currency or percentage signs. Additionally, a new CollectionTypeExtension ensures that collection entry blocks are correctly prefixed in the form theme, preventing rendering errors caused by duplicate block names in the block prefixes array.
src/Form/Extension · high confidence
Updated EasyAdmin 4 skeleton templates to use PHP 8 attributes and mandatory pretty URLs
The generated dashboard and CRUD controller skeletons now utilize the \#\[AdminDashboard\] PHP attribute for route configuration, replacing previous methods, and enforce the use of pretty URLs. The dashboard template also updates the default menu item icon class to 'fa fa-home' and imports the necessary EasyAdmin 4 classes, aligning the generated code with the framework's current requirements for EasyAdmin 4.
src/Resources/skeleton · high confidence
Updated EasyAdminBundle translation files for multiple languages
The translation files in the translations directory have been updated to include new keys and correct existing strings for languages such as Arabic, Bulgarian, Catalan, Czech, Danish, German, Greek, English, Spanish, and Basque. These updates ensure that interface elements like pagination, filters, action modals, and error messages are properly localized, including support for new features like 'contains all' array filters and autocomplete 'no more results' messages.
translations · high confidence
Updated public CSS assets to Bootstrap 5.3.8
The compiled public stylesheet has been rebuilt to include the updated Bootstrap 5.3.8 framework. This change updates the underlying CSS variables, component styles, and utility classes used by the application, ensuring compatibility with the latest Bootstrap features and fixes while maintaining the existing design system layers.
public · high confidence
Fixes
Bundled Symfony 5.4 form theme templates for consistent rendering
The application now includes its own copy of the Symfony 5.4 form theme templates (bootstrap\_5\_layout, bootstrap\_base\_layout, and form\_div\_layout) within the \templates/symfony-form-themes\ directory. This ensures that all backends, including those running on older Symfony versions like 4.4, render forms consistently using the same template version, rather than relying on the external Symfony Twig Bridge which might vary across projects.
templates/symfony-form-themes · high confidence
Test coverage
Added PHPUnit test helper traits for EasyAdmin CRUD testing; Added comprehensive data fixtures for functional testing; Added functional test fixtures for EasyAdmin CRUD and Dashboard customization options; Added functional test fixtures for advanced AdminRoute routing scenarios; Added functional test fixtures for autocomplete and group\_by features; Added functional test fixtures for dashboard configuration scenarios; Added functional tests for Action Groups, Customization, Ordering, and Security; Added functional tests for ActionMenu, Badge, Button, Pagination, and Switch components; Added functional tests for AdminRoute route generation and i18n support; Added functional tests for Avatar and Image media fields; Added functional tests for Choice, Boolean, and Association fields; Added functional tests for Collection and Array fields; Added functional tests for EasyAdmin 5 dashboard, custom forms, and row actions; Added functional tests for EasyAdmin CRUD customization options; Added functional tests for batch actions and batch delete security; Added functional tests for dashboard configuration and layout; Added functional tests for default CRUD operations; Added functional tests for default row action configuration and click triggers; Added functional tests for field types and pagination configurations; Added functional tests for form layout components; Added functional tests for international field types; Added functional tests for search configuration and behavior; Added functional tests for security features; Added functional tests for text-based fields; Added functional tests for the EasyAdmin Data Collector; Added functional tests for the Flag Twig component; Added functional tests for the index list sorting feature; Added regression tests for nested CRUD form context handling; Added test application configuration for CustomizationApp; Added test configuration files for AdminRouteApp; Added test configuration for AdminRouteApp and SecuredApp functional tests; Added test fixtures for DefaultApp configuration and templates; Added test fixtures for entity translations; Added test fixtures for functional testing; Added test fixtures for security and user menu scenarios; Added unit tests for AI agent skill installation and management; Added unit tests for AdminControllerRegistry and AdminRouteGenerator; Added unit tests for AdminRouterSubscriber and ExceptionListener; Added unit tests for CrudAutocompleteSubscriber ID handling; Added unit tests for Dto and Translation components; Added unit tests for EasyAdmin configuration and context classes; Added unit tests for EasyAdmin console commands; Added unit tests for EasyAdminTwigExtension; Added unit tests for FileUploadType and FlysystemFile model; Added unit tests for LabelGenerator humanization; Added unit tests for MenuItemMatcher selection logic; Added unit tests for ORM core components; Added unit tests for PageRangeCalculator and ThemeColorCalculator; Added unit tests for Twig UI components; Added unit tests for argument resolvers and internationalization formatter; Added unit tests for field configurators; Added unit tests for security components; Added unit tests for the Admin panel factory components; Added unit tests for the Filter subsystem; Added unit tests for the StringToFileTransformer; Added unit tests to validate the AI agent skill structure and content; Establishes testing infrastructure and guidelines for the bundle; Expanded functional test fixtures for CRUD controllers; Expanded test entity models for functional testing; New AbstractCrudTestCase for simplified EasyAdmin testing; Unit tests added for EasyAdmin form fields.
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 41.
Lenses
- Code Health 60
- Architecture 61
- Maturity 65
- Readiness 48
- Security 83
- Domain Modelling 42
- Accessibility 31
Changes since last survey
- 300 commits — 214 feature/other, 86 fixes
By area
- (repo) — 124 commits
- src/EasyAdminBundle.php — 28 commits
- assets/css — 22 commits
- (root) — 20 commits
- tests/Functional — 13 commits
- src/Field — 12 commits
- assets/js — 11 commits
- tests/Unit — 9 commits
- src/Context — 5 commits
- src/Filter — 5 commits
- .github/workflows — 4 commits
- src/Twig — 4 commits
- src/Form — 3 commits
- templates/crud — 3 commits
- assets/types.d.ts — 2 commits
- config/services.php — 2 commits
- doc/security.rst — 2 commits
- skills/easyadmin — 2 commits
- src/Config — 2 commits
- src/Controller — 2 commits
Notable commits
- fix: Fix ArrayFilter crashing when the filtered property is not a displayed field
- fix: Fix NumericFilter with null values on money fields
- fix: Fix SortDirection deprecation on Doctrine ORM
- fix: Fix TypeError when calling Crud::setFilters(null)
- fix: Fix a PHPStan issue
- fix: Fix a minor Composer autoloading issue
- fix: Fix an interface deprecation
- fix: Fix autocomplete ids with non-Symfony uid types
- fix: Fix dashboards.rst
- fix: Fix disappearing close button icon on interaction
- fix: Fix doc by removing an unused reference
- fix: Fix empty data for non-nullable text fields
- fix: Fix field configurators
- fix: Fix file upload when using Flysystem
- fix: Fix filters on nested associations and embedded properties
- fix: Fix image field lightbox init and thumbnail scroll jump
- fix: Fix nested dropdowns in inline actions
- fix: Fix search in deeply nested properties
- fix: Fix setting custom HTML attributes on boolean fields and Switch component
- fix: Fix several button design issues
- …and 280 more
Architecture
- 0 containers · 1 bounded contexts · 0 dependency edges (baseline)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
EasyCorp/EasyAdminBundle was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit bac1a3bc0dfa09a84a1bffe40a05e716f7f0b405 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.