1. Go to this page and download the library: Download dynamik-dev/cloak-laravel library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
dynamik-dev / cloak-laravel example snippets
// Mask PII before sending to an LLM
$safe = cloak('Contact [email protected] or call 555-123-4567');
// "Contact {{EMAIL_x7k2m9_1}} or call {{PHONE_x7k2m9_1}}"
// Restore the original data
$original = uncloak($safe);
// "Contact [email protected] or call 555-123-4567"
// config/cloak.php
return [
// false (default): In-memory storage, auto-cleared after request
// true: Cache storage, persists across requests
'persist' => env('CLOAK_PERSIST', false),
// Storage driver class when persist is true
'storage_driver' => DynamikDev\Cloak\Laravel\CacheStorage::class,
// Cache store to use (null = default cache)
'cache_store' => env('CLOAK_CACHE_STORE'),
// TTL for cached mappings in seconds
'default_ttl' => env('CLOAK_DEFAULT_TTL', 3600),
];
use DynamikDev\Cloak\Laravel\Facades\Cloak;
$masked = Cloak::cloak($text);
$restored = Cloak::uncloak($masked);
use DynamikDev\Cloak\Cloak;
class ChatController extends Controller
{
public function send(Request $request, Cloak $cloak)
{
$safe = $cloak->cloak($request->input('message'));
// ...
}
}
use OpenAI\Laravel\Facades\OpenAI;
public function chat(Request $request)
{
$userMessage = $request->input('message');
// "Help me email [email protected] about invoice #1234.
// My number is 555-867-5309 if they need to call back."
// 1. Cloak PII before sending to OpenAI
$safeMessage = cloak($userMessage);
// "Help me email {{EMAIL_a1b2c3_1}} about invoice #1234.
// My number is {{PHONE_a1b2c3_1}} if they need to call back."
// 2. Send to OpenAI - no PII exposed to the API
$response = OpenAI::chat()->create([
'model' => 'gpt-4',
'messages' => [
['role' => 'system', 'content' => 'You are a helpful assistant.'],
['role' => 'user', 'content' => $safeMessage],
],
]);
// 3. Get the response (LLM uses placeholders naturally)
$aiResponse = $response->choices[0]->message->content;
// "Here's a draft email for {{EMAIL_a1b2c3_1}}:
// Subject: Regarding Invoice #1234..."
// 4. Restore PII for the user
$finalResponse = uncloak($aiResponse);
// "Here's a draft email for [email protected]:
// Subject: Regarding Invoice #1234..."
return response()->json(['response' => $finalResponse]);
}
use DynamikDev\Cloak\Detector;
// Only detect emails and phones
$masked = cloak($text, [
Detector::email(),
Detector::phone(),
]);
// Phone detection with region hint (improves accuracy)
$masked = cloak($text, [
Detector::phone('US'),
]);
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class LogSafeRequests
{
public function handle(Request $request, Closure $next)
{
// Log request with PII masked
Log::info('API Request', [
'path' => $request->path(),
'body' => cloak(json_encode($request->all())),
]);
return $next($request);
}
}
// In your AppServiceProvider
use DynamikDev\Cloak\Cloak;
use DynamikDev\Cloak\Detector;
$this->app->extend(Cloak::class, function ($cloak, $app) {
return $cloak->withDetectors([
Detector::email(),
Detector::phone('US'),
// Add your custom detectors
])->filter(function ($detection) {
// Filter out test emails
return !str_ends_with($detection['match'], '@test.local');
});
});