chameleon-system/sanitycheck
Laravel package for running sanity checks in Chameleon System projects. Provides a structured way to define checks, execute them via CLI, and report results to help catch misconfigurations and deployment issues early in development and operations.
Installation
composer require chameleon-system/sanitycheck
Add the service provider to config/app.php:
'providers' => [
// ...
ChameleonSystem\SanityCheck\SanityCheckServiceProvider::class,
],
Publish Config (Optional)
php artisan vendor:publish --provider="ChameleonSystem\SanityCheck\SanityCheckServiceProvider"
Config file: config/sanitycheck.php.
First Use Case: Basic Validation
use ChameleonSystem\SanityCheck\Facades\SanityCheck;
$data = ['email' => 'test@example.com', 'active' => false];
$rules = [
'email' => 'required|email',
'active' => 'boolean',
];
$result = SanityCheck::validate($data, $rules);
if ($result->fails()) {
// Handle errors: $result->errors()
}
Wrap incoming requests for automatic validation:
use ChameleonSystem\SanityCheck\Facades\SanityCheck;
public function store(Request $request)
{
$result = SanityCheck::validate($request->all(), [
'title' => 'required|string|max:255',
'content' => 'nullable|string',
]);
if ($result->fails()) {
return response()->json($result->errors(), 422);
}
// Proceed with logic...
}
Use closures for runtime rules:
$rules = [
'user_id' => function ($value, $attribute) {
return User::where('id', $value)->exists() ? 'valid' : 'invalid';
},
];
Override default messages:
$rules = [
'age' => [
'rule' => 'integer|min:18',
'message' => 'You must be at least 18 years old.',
],
];
Validate arrays of data (e.g., bulk imports):
$users = [
['name' => 'Alice', 'email' => 'alice@example.com'],
['name' => 'Bob', 'email' => 'invalid-email'],
];
$results = SanityCheck::batchValidate($users, [
'name' => 'required|string',
'email' => 'required|email',
]);
// $results contains an array of Result objects per item.
Extend validation with events:
SanityCheck::extend('custom_rule', function ($value, $attribute, $params) {
return $value === $params['expected'];
});
// Usage:
$rules = ['secret' => ['custom_rule', ['expected' => '123']]];
Rule Order Matters
Rules are evaluated left-to-right. Place stricter rules (e.g., required) before type checks (e.g., integer).
Nested Arrays The package doesn’t natively support nested arrays. Flatten or use a custom rule:
$rules = [
'user.*' => 'array|min:3',
'user.*.role' => 'string',
];
Performance with Large Datasets
batchValidate() processes items sequentially. For parallel validation, use Laravel’s parallel helper or queue jobs.
Facade vs. Direct Usage
The facade caches the container instance. For testing, inject the SanityCheck class directly:
$this->app->bind(SanityCheck::class, function () {
return new SanityCheck();
});
Enable Debug Mode
Set 'debug' => true in config/sanitycheck.php to log raw validation data.
Inspect Failed Rules
Use $result->failedRules() to see which rules triggered errors:
dd($result->failedRules()); // ['email' => ['required']]
Custom Rule Debugging
Add dd($value, $attribute, $params) inside custom rules to inspect inputs.
Add Custom Rules Register globally in a service provider:
SanityCheck::extend('slug', function ($value) {
return preg_match('/^[a-z0-9\-]+$/', $value);
});
Override Default Rules
Replace built-in rules (e.g., email) by redefining them:
SanityCheck::override('email', function ($value) {
return filter_var($value, FILTER_VALIDATE_EMAIL) !== false;
});
Integrate with Laravel Pipelines Chain validation with other logic:
$result = SanityCheck::validate($data, $rules)
->then(function ($data) {
// Post-validation logic
});
Localization
Translate error messages via Laravel’s Lang facade:
$rules = [
'name' => [
'rule' => 'required',
'message' => trans('validation.required', ['attribute' => 'Name']),
],
];
How can I help you explore Laravel packages today?