Adminix Documentation Help

Global Search

Global search adds a shell-level search input to the Adminix sidebar. It is configured server-side and searches only explicitly declared resources.

Use it for fast admin navigation across known resources, not as a replacement for per-list filters or application search pages.

Panel Configuration

use AlexKudrya\Adminix\AdminixPanel; use AlexKudrya\Adminix\Search\GlobalSearchResource; use App\Models\Order; AdminixPanel::make('adminix') ->globalSearch( GlobalSearchResource::make('orders') ->title('Orders') ->dataSource(Order::class) ->primaryKey('id') ->searchFields(['number', 'customer_name']) ->titleField('number') ->descriptionField('customer_name') ->criteria([ ['tenant_id', '=', 9], ]) ->adminixUri('orders/{id}') ->limit(5) );

When at least one resource is configured, Adminix renders a search input in the sidebar. Typing sends GET /{panel}/api/global-search?q=.... Results are grouped by resource title and clicking a result opens the server-built URL.

Rendered example:

Adminix global search results

Legacy Config

Legacy configuration can use arrays:

'global_search' => [ 'resources' => [ [ 'name' => 'orders', 'title' => 'Orders', 'data_source' => App\Models\Order::class, 'primary_key' => 'id', 'search_fields' => ['number', 'customer_name'], 'title_field' => 'number', 'description_field' => 'customer_name', 'criteria' => [ ['tenant_id', '=', 9], ], 'adminix_uri' => 'orders/{id}', 'limit' => 5, ], ], ],

Panel-level configuration can also provide global_search.resources or global_search_resources.

Resource Contract

  • name() is a stable resource key used in the JSON payload.

  • title() is the visible group label.

  • dataSource() accepts an Eloquent model class or table name.

  • searchFields() accepts direct datasource columns only.

  • titleField() is required and becomes the visible result title.

  • descriptionField() is optional supporting text.

  • criteria() is applied server-side before search.

  • limit() is capped between 1 and 25 per resource.

  • minLength() defaults to 2 characters.

  • adminixUri(), url(), or urlUsing() should build the result URL.

Placeholders such as {id} or {number} are replaced from the matched row and URL-encoded.

GlobalSearchResource::make('orders') ->dataSource(Order::class) ->searchFields(['number']) ->titleField('number') ->adminixUri('orders/{id}?search-orders={number}');

Use urlUsing() when the destination depends on application logic:

GlobalSearchResource::make('orders') ->dataSource(Order::class) ->searchFields(['number']) ->titleField('number') ->urlUsing(fn ($row) => route('orders.show', $row->id));

Security

Global search is opt-in. Adminix does not scan all pages, models, or list modules automatically.

Keep tenant, owner, and permission limits in criteria() or in a server-owned URL resolver. Do not expose sensitive fields as searchFields(), titleField(), or descriptionField(). The browser can send only a query string; datasource, fields, criteria, limits, and result URLs are derived from package configuration.

Search text is length-capped and SQL LIKE wildcards are escaped. Invalid resource configuration returns a controlled JSON error instead of a 500 response.

Doctor

php artisan adminix:doctor --strict validates global search resources:

  • resource shape and name;

  • datasource model/table;

  • direct column identifiers;

  • required search fields and title field;

  • known table columns when the table is available;

  • presence of url(), adminixUri(), or urlUsing().

Last modified: 23 July 2026