Changelog
About 3091 wordsAbout 10 min
changelogreleasesversions
Release history
Explore every stable release and the changes currently being prepared. Select a version to open its GitHub release.
UnreleasedNext release
Added
- Field-specific operator policies with exact-field and wildcard rules across Invokable, Ruleset, Expression, and Tree engines.
Removed
- The unused
Resources,FilterableSettings, and resource bag APIs. - Legacy field-validation, mapping, and tree-relation helpers superseded by the shared payload pipeline.
- Pass-through
ApplierandExecuterabstractions and their redundant contracts; engines and payload appliers are now invoked directly. - Redundant capability interfaces implemented only by the base engine; the abstract
Engineclass now defines its required extension contract directly. - Duplicated engine-specific context interfaces, including the misspelled
RulesetFilterableContect; model integration now depends on one focusedFilterableContextcontract.
Fixed
- Filter resolution return types now allow the raw Eloquent builder returned by
shouldReturnQueryBuilder().
v3.0.1
Fixed
- Tree groups now join their direct children using the group's declared
ANDorORboolean, including across recursively nested groups.
v3.0.0
Added
- A composable sanitization pipeline with reusable built-in sanitizers for trimming, casting, normalization, clamping, and safe string handling.
- A method-attribute pipeline for validation, authorization, transformation, sanitization, scoping, defaults, and conditional skipping.
Filterable::for()for creating model-aware filter instances without manually wiring an Eloquent builder.- A dedicated runtime
Contextfor applied and skipped payload state. - Skipped-filter tracking with the original
Payloadand skip reason. - Nested and deeply nested relational-field filtering across all engines.
- Extensible operator strategies and custom operator resolution.
- Custom paths and namespaces for the
make-filtercommand. - Laravel 13 support.
- Versioned documentation channels for stable majors and upcoming changes.
Changed
- The filtering pipeline now uses
Payloaddirectly from parsing through query application, removing the redundantClauselayer. Filterable::applied()returns finalPayloadsnapshots, including the original raw value.- Builder methods are forwarded automatically after pending filters are applied, without maintaining a manual method allowlist.
- Query application preserves complete nested relation paths consistently across the Invokable, Ruleset, Expression, and Tree engines.
- Runtime-aware method attributes now receive the active engine and payload.
InteractsWithFilterableis the preferred model trait;HasFilterableremains as a deprecated compatibility alias.- The documentation was reorganized and redesigned with clearer navigation, community guides, an AI-assistant guide, and an updated package homepage.
Breaking Changes
Clause,ClauseFactory,ClauseApplier,ClauseKeyMapper,OperatorMapper,OperatorDefinition,OperatorDefinitionContract, andRelationResolverhave been removed.Commitable::commit()andFilterable::commit()acceptPayloadinstead ofClause.- Engine skip hooks accept
Payloadand an optional message. SkipExecution::getClause()has been replaced bygetPayload().Filterable::get()has been replaced bygetFromRequest().AttributeContextis constructed from the active engine and payload.HandlerFactoryhas been removed in favor of the sanitizer pipeline.
v2.15.0
Added
- Expanded the Invokable method-attribute suite with authorization, range and membership checks, casting, splitting, value mapping, regex validation, sanitization, scopes, conditional skipping, and trimming.
Payload::cast()andPayload::as()helpers for dynamic value casting.- Optional in-place value replacement for
Payload::explode()andsplit().
Changed
- Attribute processing now distinguishes method attributes through the
MethodAttributecontract.
v2.14.1
Added
- The
Outcomecontract for representing resolved and rejected attribute processing results.
Changed
- Renamed the payload's pre-sanitization value property from
beforeSanitizetorawValue;raw()remains the accessor. - Attribute processing now returns an
Outcome.
Fixed
- Filter execution now returns the result of the
finally()lifecycle hook.
v2.14.0
Added
- Dynamic Eloquent builder method forwarding from a
Filterableinstance via theHandleFluentReturntrait.
v2.13.3
Fixed
- Relaxed Illuminate dependency constraints so Laravel 10, 11, and 12 can all be installed with the package.
v2.13.2
Changed
- Updated Illuminate and related dependencies for Laravel 12 compatibility.
v2.13.1
Fixed
- Eloquent builder type declarations now use the builder contract for broader implementation compatibility.
v2.13.0
Added
- Configurable exception handlers for filtering failures.
FilterableExceptionHandler, the default handler,StrictnessException,SkipExecution, and dedicated empty-value errors.- The
Skippablecontract and engine-level guarded execution.
Changed
- All engines now route filtering failures through a shared exception-handling path, allowing strict execution or controlled skipping.
- Engine exceptions were consolidated under the Engines namespace.
v2.12.0
Added
- Applied-filter state through
commit()andapplied()across all engines. - Payload helpers for membership checks, rule matching, empty-value checks, slugs, regular expressions, date and timestamp validation, Carbon conversion, and value splitting.
- Macro support on
Payload.
Changed
- Shared engine configuration for allowed fields, operators, and empty-value behavior was centralized in the engine foundation.
v2.11.0
Added
initially()andfinally()lifecycle hooks for transforming the query builder before and after filtering.- Lifecycle hook placeholders in generated filter classes.
v2.10.4
Changed
- Metadata-only release tag. It points to the same commit as
v2.10.0and contains no additional code changes.
v2.10.0
Added
- Query-result caching with deterministic cache keys, tags, scopes, and profile-aware configuration.
- Automatic model-event cache invalidation.
- Cache controls on
Filterable, the facade, and fluent invoker.
v2.9.4
Fixed
- Invokable filter methods can no longer conflict with core
Filterablemethods.
v2.9.3
Fixed
- Provider inheritance now resolves profiler driver definitions consistently.
- Raw field, operator, and value expressions are parsed more reliably by the dissector.
v2.9.2
Fixed
- Generated filter method names are validated and normalized before files are written.
v2.9.1
Changed
- Corrected public API names and references, including
InvokeabletoInvokable,useEngintouseEngine, and misspelled allowed-field methods.
v2.9.0
Added
- CLI commands to set up the package, create filters and filter methods, list filters, inspect filter configuration, test generated SQL, and discover searchable columns and suggested indexes.
- Reusable command helpers and request-source inspection.
Fixed
- Stub path resolution, command signatures, directory creation, model detection, and invalid filter-class reporting.
v2.8.0
Added
- Invokable operator allowlists and automatic allowed-field discovery from declared filter methods.
- Mutable field and operator accessors on
Payload.
Changed
- Clause creation and application now use
Payload, the dissector, and the shared clause factory consistently.
v2.7.0
Added
- Data provisioning for sharing contextual values across
Filterableinstances and retrieving either a single key or the complete data set.
v2.6.1
Fixed
- Corrected sanitizer constructor typing and normalized internal trait references.
v2.6.0
Added
- Filter profiles for applying reusable, context-dependent filtering configuration.
FilterableStatefor exposing filtering status to event observers.- Matchable profile conditions.
Changed
- Event callbacks now receive filtering state through
FilterableState.
v2.5.3
Added
- A centralized event system for observing the filtering lifecycle.
- Filterable event registration and a singleton event manager.
Fixed
- Observer payloads are now passed to callbacks correctly.
v2.4.3
Fixed
- Package configuration now uses cache-safe arrays instead of collections.
v2.4.2
Added
- The
Filterablefacade and its service-provider bindings. - Runtime registration of custom engines through
EngineManager::extend(). tap()andunless()for fluent instance configuration and conditional filtering.
Changed
- Service-provider registration was corrected to rely on Laravel package discovery.
v2.3.2
Added
- Mutable payload values through
Payload::setValue(). - The initial attribute pipeline, registry, handler contract, and processing context for Invokable filters.
DefaultValueandRequiredattributes.
Changed
- Invokable filter initialization now processes method attributes.
v2.2.2
Changed
- Renamed the internal
FilterRegisteratortoFilterResolverand reduced duplicate resolution logic.
Fixed
filter()now accepts a filter class name directly and resolves aliases and model-declared filters consistently.
v2.2.1
Fixed
- Sanitization is now applied consistently by Invokable, Ruleset, Expression, and Tree engines.
v2.2.0
Added
- Query sorting with field allowlists, aliases, field mapping, multi-field input, and Invokable integration.
- Per-instance controls for the sort key, delimiter, and SQL null placement.
- Relation-path validation and optional empty-value skipping in the Ruleset engine.
Changed
- Clause construction was centralized in
ClauseFactory.
v2.1.0
Added
- Payload conversion and inspection helpers for LIKE values, booleans, integers, arrays, JSON, length, type, null, and empty-value checks.
v2.0.0
Added
- Laravel 12 support alongside Laravel 8, 9, 10, and 11.
- Automatic model
filter()macro registration and filter-class resolution from a model's$filterableproperty. - Filter aliases, a global
filterable()helper, and Laravel container-based filter resolution. - Fluent
when(),through(),toSql(), and query execution through the serializableInvokerwrapper. - Customizable published filter stubs.
- Query profiling with file and database storage plus profiler events.
- Per-page pagination limits, field normalization, and optional sanitizer disabling.
Changed
- Rebuilt the engine foundation around a shared abstract engine, contracts, settings, bags, parsing, mapping, clause application, and execution services.
- Service-provider responsibilities now use package discovery and automatic model integration.
- Renamed the sanitization contract from
HasSanitizetoSanitizable.
Breaking Changes
- Engine implementations now extend the shared abstract engine and use the new execution contracts.
- Automatic macro registration replaces manual model-trait setup for normal usage.
v1.0.0
Added
- Initial stable release with Invokable, Ruleset, Expression, and Tree filtering engines.
- Eloquent model scope integration and dynamic engine selection, including optional header-driven selection.
- Allowed-field and operator validation, field mapping, relational filtering, and hierarchical
AND/ORgroups. - Request-backed or manually supplied input, empty-value handling, sanitization, authorization, and validation hooks.
Payloadas the Invokable engine's filter-value context.- Artisan filter generation and publishable package configuration.
- Initial PHPUnit suite, CI workflow, README, and documentation site.
