laminas/laminas-filter
laminas-filter provides a set of common data filters for PHP, helping you normalize and sanitize input with reusable, composable filter classes and filter chains. Includes string, number, and file filters, with support for custom implementations.
Start by installing the package via Composer (composer require laminas/laminas-filter). Begin with common built-in filters like StringTrim, Digits, ToNull, and Callback to sanitize incoming request data—especially for form fields or JSON payloads. The entry point is usually the Laminas\Filter\FilterChain or instantiating filters directly (e.g., (new \Laminas\Filter\StringTrim())->filter($input)). For Laravel projects, use it in controllers or form request classes before validation, not instead of it. Check src/ for filter classes—each implements Laminas\Filter\FilterInterface with a single filter() method.
FilterChain, ideal for nested arrays (e.g., trimming all strings in a POST payload).
$chain = new FilterChain();
$chain->attach(new StringTrim())
->attach(new StringToLower());
$clean = $chain->filter($input);
rules() or custom formatters—don’t overload validation rules with transformations. For example, strip HTML tags using HtmlEntities before Rule::required|string|max:255.Laminas\Filter\FilterInterface to create domain-specific filters (e.g., SanitizeSlug, NormalizePhone), and register them in service containers if using Laravel’s DI.laminas/laminas-validator for robust input pipelines—filter first, validate second.StringTrim on already-trimmed input) may still trigger processing—test edge cases (especially Digits or Int filters on non-numeric strings).Null vs. '': Filters like Digits return empty string '' for invalid input, not null. Use ToNull after such filters to convert empty strings to null.StringToLower before StringTrim vs. after can affect case-sensitivity in whitespace logic (though rare, ensure consistency).Int on optional numeric fields where null is acceptable.collect($request->all())->map(fn($value) => (new StringTrim())->filter($value)) for bulk trimming, but prefer targeted filtering per field instead of blanket transformations to avoid data loss (e.g., trimming passwords or base64 content breaks them).__toString() or use var_dump in a closure filter to trace intermediate values in chains.How can I help you explore Laravel packages today?