Upgrade and Changelog
Current stabilization notes
This release line focuses on package stabilization and safer defaults.
Changed
Laravel service provider is auto-discovered through Composer metadata.
Default package config no longer references application-specific
App\Adminix\Pagesclasses.adminix:installpublishes config, assets, and optional examples.make:adminix_resourcecreates a starter resource page provider.Save and create controllers derive
dataSource, primary key, and writable fields from server-side module configuration.Search uses
ILIKEonly on PostgreSQL andLIKEon other drivers.Search escapes
LIKEwildcards and caps query length before applying filters.Soft-deleted updates call
withTrashed()only for Eloquent models that useSoftDeletes.Composer package scripts no longer run Laravel app-only Artisan commands from the package root.
Compact Laravel Boost guidelines and skill resources are available for parent projects.
Public asset publishing includes Adminix runtime JavaScript, CKEditor 5 runtime files, and local vendor assets for CDN-free mode.
CKEditor 5 runtime assets are loaded lazily by
adminix-editor.jsonly on pages that render WYSIWYG/editor fields.Resource
IMAGEfields are writable URL/path inputs; resourceJSONfields are writable textareas.Page catch-all routing is GET-only; save/create operations stay on explicit POST routes.
Stored upload fields reject scalar path submissions on update; upload paths change only through real files or allowed remove checkboxes.
make:adminix_resource --modelrejects invalid PHP class names before dry-run output or file generation.Signed endpoint contexts and newly dispatched queued imports/bulk actions are bound to their Adminix panel. Refresh open multi-panel forms after upgrading; pre-upgrade queued jobs without a panel key are rejected when multiple panels are configured. Single-panel applications continue to accept legacy unbound contexts.
Refresh every already open contextual resource/modal form after upgrading. Resource fetch, create, update, relation, and async-select endpoints that depend on route params, tenant providers, relations, or contextual visibility now require the current signed form context with verified page params and fail closed when it is omitted.
Scoped queued imports and bulk actions now use new job class names as a mixed-version deployment guard. Pause or drain the Adminix queues and restart every worker on the new package version before resuming web traffic; the new job classes also check a parent-runtime marker and fail closed when an old worker has already loaded the previous parent class. New workers remain able to execute already queued legacy job class names.
Tenant-provider exceptions now stop Adminix-owned scoped queries and writes instead of falling back to an empty criterion set. Verify custom providers return
nullonly when no tenant scope is intentionally active and reserve exceptions for unavailable/invalid context.Upgrade Adminix to v2.78.1 or later and run
php artisan migrateto repair standard saved-table-view storage. The new forward migration has its own timestamp, so Laravel executes it even when the June and July migrations are already recorded. It preserves valid rows, uses 64-character owner/panel declarations where the database enforces them, backfills missing panel keys to the resolved default panel, repairs the exact panel indexes, and removes legacy indexes. Laravel does not re-run an edited historical migration.The saved-table-view repair stops before narrowing columns or rebuilding indexes when it finds a missing required column, an owner/panel key longer than 64 characters, or duplicate rows in the target owner/panel/page/module/name scope. Resolve the reported data or schema conflict, run
php artisan migrateagain, then confirm the storage finding is gone withphp artisan adminix:doctor --strict. Adminix does not silently truncate keys, delete rows, or merge ambiguous presets.Custom
TableViewProviderInterfaceimplementations must scope list/save/delete byTableViewQueryDto::ownerKey(),panelKey(),pageName(), andmoduleName(). If different panels later save the same view name, consolidate those duplicates before rolling back because the legacy unique index cannot represent them safely.Run
php artisan migrateto repair a missingusers.is_admincolumn whenusersalready exists, even if the historical Adminix migration is recorded. The repair is idempotent, leaves an application-owned existing column and its data unchanged, and intentionally preserves the column on rollback because package ownership cannot be inferred safely. If the application createsusersonly after all Adminix migrations are recorded, add the column in that later application migration.Run
php artisan migrateto add the persistent-notificationpanel_keyscope. Existing rows are backfilled to the same resolved default panel, including the bounded digest for an unusually long key.NotificationService::add()uses the current panel during an Adminix request; queue, command, and other out-of-request producers targeting a non-default panel must passpanel_keyexplicitly. Custom notification providers must includeNotificationQueryDto::panelKey()in read and mark-read scopes.The
AdminixUsertrait supplies a default boolean cast foris_admin; an application-defined cast for that attribute is preserved.
Compatibility
Supported constraints are declared in composer.json:
Laravel 12 requires PHP
>=8.2;Laravel 13 requires PHP
>=8.3;Symfony HTTP Foundation
^6.3|^7.0|^8.0.
CI now only builds and publishes the Writerside documentation pages. Run PHPUnit, coverage threshold checks, and PHP/Laravel compatibility checks locally before release-sensitive upgrades.
Upgrade checklist
If the application uses queued Adminix imports or bulk actions, pause dispatch, drain the queues, and stop every worker before changing package code.
Run
composer update alex-kudrya/adminix.Run
php artisan migrateso enabled standard notification storage receives the current panel scope and the new forward saved-table-view repair converges historical storage. If the saved-table-view repair reports overlong keys, duplicate target-scope rows, or a missing required column, resolve that exact conflict and run the command again.Publish new assets with
php artisan vendor:publish --provider="AlexKudrya\Adminix\Providers\AdminixServiceProvider" --tag=laravel-assets --force; this refreshes the public runtime files without overwritingconfig/adminix.phpand is required before usingADMINIX_ASSET_MODE=local.If your app published assets before v2.0.7, remove stale
public/js/adminix/ckeditorandpublic/css/adminix/ckeditor.cssafter republishing.Check
config/adminix.php; explicitly configurepages. Emptymenu.linksis valid for initial setup.Keep
no_auth_accessdisabled outside local/demo environments.Run
php artisan adminix:doctor --strictand resolve storage/schema findings before reopening Adminix traffic.Restart every queue worker only after all web and worker processes use the new package version, then resume dispatch.
Run your application test suite around Adminix CRUD pages, modal forms, notifications, saved table views, and queued imports/actions.
Adminix keeps legacy one-based route params working for existing page providers (param:1 for /adminix/user/123). For new or migrated pages, use the current zero-based contract (param:0 for the first route tail parameter) and avoid mixing both styles inside one page provider.