Installation:
composer require directorytree/privacy-filter
Run the publisher (if needed) to publish the config:
php artisan vendor:publish --provider="DirectoryTree\PrivacyFilter\PrivacyFilterServiceProvider"
First Use Case: Detect private entities (e.g., PII) in a string:
use DirectoryTree\PrivacyFilter\Facades\PrivacyFilter;
$text = "John Doe's SSN is 123-45-6789 and email is john@example.com";
$results = PrivacyFilter::filter($text);
// Outputs detected entities (e.g., SSN, email)
dd($results);
Where to Look First:
DirectoryTree\PrivacyFilter\Facades\PrivacyFilter (primary entry point).config/privacy-filter.php (model path, binary path, etc.).DirectoryTree\PrivacyFilter\PrivacyFilterServiceProvider (boot logic).Filtering Text for PII:
// Basic usage
$results = PrivacyFilter::filter($text);
// With custom model (if configured)
$results = PrivacyFilter::filter($text, 'custom-model.gguf');
Batch Processing:
$texts = ["Text 1 with PII", "Text 2 with PII"];
$results = PrivacyFilter::batchFilter($texts);
Integration with Laravel Requests:
// Filter user input (e.g., form submissions)
$request->validate(['text' => 'required']);
$filtered = PrivacyFilter::filter($request->input('text'));
Middleware for Automatic Filtering:
// app/Http/Middleware/FilterPII.php
public function handle(Request $request, Closure $next) {
if ($request->has('sensitive_data')) {
$request->merge(['filtered_data', PrivacyFilter::filter($request->sensitive_data)]);
}
return $next($request);
}
Model Management:
php artisan privacy-filter:download-model
config/privacy-filter.php:
'model_path' => storage_path('app/privacy-models'),
// Dispatch a job to filter text in the background
FilterTextJob::dispatch($text)->onQueue('privacy');
PrivacyFilter::filter($text)->then(function ($results) {
event(new PIIDetected($results));
});
$response = PrivacyFilter::filter($user->bio);
return response()->json(['bio' => $response]);
Binary Compatibility:
config/privacy-filter.php for binary_path).Model Downloads:
php artisan privacy-filter:download-model
storage_path('app/privacy-models').Performance:
$cacheKey = 'privacy_filter_' . md5($text);
$results = cache()->remember($cacheKey, now()->addHours(1), fn() => PrivacyFilter::filter($text));
False Positives/Negatives:
privacy-filter.cpp may misclassify edge cases (e.g., non-PII data like "123 Main St" flagged as an address).DirectoryTree\PrivacyFilter\PrivacyFilter and overriding filter() logic.Configuration Overrides:
PRIVACY_FILTER_MODEL_PATH=/custom/path/to/models
Binary Path Issues:
config('privacy-filter.binary_path'). Reinstall with:
composer require directorytree/privacy-filter --update-with-dependencies
Model Loading Errors:
storage/logs/laravel.log for missing model files. Manually download from PrivacyFilterBinaries.Permission Denied:
chmod -R 775 storage/
Custom Models:
config('privacy-filter.models'):
'models' => [
'default' => 'default-model.gguf',
'custom' => 'path/to/custom-model.gguf',
],
PrivacyFilter::filter($text, 'custom');
Post-Processing:
PrivacyFilter facade to add callbacks:
PrivacyFilter::extend(function ($filter) {
$filter->after(function ($results) {
// Log or transform results
});
});
Testing:
expectsJobs() or fake():
use DirectoryTree\PrivacyFilter\Jobs\FilterTextJob;
$this->fake(FilterTextJob::class);
PrivacyFilter::filter($text); // Won't execute the binary
Custom Entities:
privacy-filter.cpp's default rules. To add custom rules (e.g., company-specific PII), rebuild the binary with your custom rules and replace the default binary.How can I help you explore Laravel packages today?