dms/dms-filter
Filter and sanitize object properties via PHP attributes. Annotate fields with rules like Trim, StripTags, and StripNewlines, then run a Filter service to clean entity values automatically—ideal alongside Symfony Validator and for consistent input normalization.
composer require dms/dms-filter
use DMS\Filter\Rules as Filter;
class User {
#[Filter\Trim]
public string $name;
}
FilterService:
$filterService = new \DMS\Filter\FilterService();
$user = new User();
$user->name = " <script>alert('xss')</script> ";
$filtered = $filterService->filter($user);
// Output: "alert('xss')" (stripped of whitespace and HTML tags if using StripTags)
StripTags, Trim, Sanitize).Input Sanitization:
#[Filter\StripTags]
#[Filter\Sanitize]
public string $bio;
Data Normalization:
#[Filter\Trim]
#[Filter\Lowercase]
public string $username;
Conditional Filtering: Dynamically apply filters based on context:
$filterService = new FilterService();
$filters = [
'name' => [new \DMS\Filter\Rules\Trim(), new \DMS\Filter\Rules\StripTags()],
'email' => [new \DMS\Filter\Rules\Sanitize()]
];
$filtered = $filterService->filter($user, $filters);
Laravel Request Filtering:
Bind the FilterService to a service provider and inject it into controllers:
// app/Providers/AppServiceProvider.php
public function register() {
$this->app->bind(\DMS\Filter\FilterService::class, function ($app) {
return new \DMS\Filter\FilterService();
});
}
Then use it in controllers:
public function store(Request $request) {
$user = new User();
$user->name = $request->input('name');
$filteredUser = app(\DMS\Filter\FilterService::class)->filter($user);
}
Form Request Validation + Filtering:
Combine with Laravel’s FormRequest for validation + filtering:
public function rules() {
return ['name' => 'required|string'];
}
public function withValidator($validator) {
$validator->after(function ($validator) {
$filtered = app(\DMS\Filter\FilterService::class)->filter($this);
$this->merge($filtered);
});
}
API Response Filtering: Filter sensitive data before JSON serialization:
$response = response()->json($filterService->filter($user));
Batch Processing: Filter collections of entities:
$users = User::all();
$filteredUsers = collect($users)->map(function ($user) {
return $filterService->filter($user);
});
Attribute Loading Issues:
@Filter\Trim).Performance Overhead:
$cacheKey = 'filtered_user_' . $user->id;
$filtered = cache()->remember($cacheKey, now()->addHours(1), function () use ($user) {
return $filterService->filter($user);
});
Custom Rules Conflicts:
namespace App\Filters;
class CustomRule extends \DMS\Filter\Rules\AbstractRule { ... }
Recursive Filtering:
FilterService::filterRecursive() for deep filtering:
$filterService->filterRecursive($user);
Verify Filters Are Applied:
Check if annotations are parsed correctly by inspecting the FilterService internals or enabling debug mode:
$filterService->setDebug(true); // Logs applied filters
Handle Exceptions: Wrap filtering in try-catch blocks for edge cases (e.g., malformed data):
try {
$filtered = $filterService->filter($user);
} catch (\DMS\Filter\Exception\FilterException $e) {
Log::error($e->getMessage());
$filtered = $user; // Fallback
}
Custom Filter Rules:
Register custom rules via the FilterService:
$filterService->addRule('custom_rule', new \App\Filters\CustomRule());
Disable Specific Filters: Override default filters for specific properties:
$filters = [
'name' => [new \DMS\Filter\Rules\Trim()] // Exclude StripTags
];
$filterService->filter($user, $filters);
Attribute Reflection:
If using legacy annotations (PHP < 8), ensure the dms/annotation package is installed:
composer require dms/annotation
Create Custom Rules:
Extend AbstractRule to build domain-specific filters:
namespace App\Filters;
use DMS\Filter\Rules\AbstractRule;
class Slugify extends AbstractRule {
public function apply($value) {
return Str::slug($value);
}
}
Modify Filter Order:
Use setRuleOrder() to prioritize rules:
$filterService->setRuleOrder([
\DMS\Filter\Rules\Trim::class,
\DMS\Filter\Rules\StripTags::class
]);
Integrate with Laravel Events:
Trigger filtering on model events (e.g., saving):
// app/Models/User.php
protected static function boot() {
static::saving(function ($user) {
$user->setAttributes(app(\DMS\Filter\FilterService::class)->filter($user));
});
}
Conditional Filtering Logic: Use closures for dynamic rules:
$filterService->addRule('conditional', function ($value, $property) {
return $property === 'email' ? strtolower($value) : $value;
});
How can I help you explore Laravel packages today?