Adminix Documentation Help

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\Pages classes.

  • adminix:install publishes config, assets, and optional examples.

  • make:adminix_resource creates a starter resource page provider.

  • Save and create controllers derive dataSource, primary key, and writable fields from server-side module configuration.

  • Search uses ILIKE only on PostgreSQL and LIKE on other drivers.

  • Search escapes LIKE wildcards and caps query length before applying filters.

  • Soft-deleted updates call withTrashed() only for Eloquent models that use SoftDeletes.

  • 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.js only on pages that render WYSIWYG/editor fields.

  • Resource IMAGE fields are writable URL/path inputs; resource JSON fields 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 --model rejects 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 null only 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 migrate to 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 migrate again, then confirm the storage finding is gone with php artisan adminix:doctor --strict. Adminix does not silently truncate keys, delete rows, or merge ambiguous presets.

  • Custom TableViewProviderInterface implementations must scope list/save/delete by TableViewQueryDto::ownerKey(), panelKey(), pageName(), and moduleName(). 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 migrate to repair a missing users.is_admin column when users already 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 creates users only after all Adminix migrations are recorded, add the column in that later application migration.

  • Run php artisan migrate to add the persistent-notification panel_key scope. 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 pass panel_key explicitly. Custom notification providers must include NotificationQueryDto::panelKey() in read and mark-read scopes.

  • The AdminixUser trait supplies a default boolean cast for is_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

  1. If the application uses queued Adminix imports or bulk actions, pause dispatch, drain the queues, and stop every worker before changing package code.

  2. Run composer update alex-kudrya/adminix.

  3. Run php artisan migrate so 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.

  4. Publish new assets with php artisan vendor:publish --provider="AlexKudrya\Adminix\Providers\AdminixServiceProvider" --tag=laravel-assets --force; this refreshes the public runtime files without overwriting config/adminix.php and is required before using ADMINIX_ASSET_MODE=local.

  5. If your app published assets before v2.0.7, remove stale public/js/adminix/ckeditor and public/css/adminix/ckeditor.css after republishing.

  6. Check config/adminix.php; explicitly configure pages. Empty menu.links is valid for initial setup.

  7. Keep no_auth_access disabled outside local/demo environments.

  8. Run php artisan adminix:doctor --strict and resolve storage/schema findings before reopening Adminix traffic.

  9. Restart every queue worker only after all web and worker processes use the new package version, then resume dispatch.

  10. 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.

Last modified: 23 July 2026