This guide is for teams shipping TOON in real applications with low risk.
Start with safe defaults:
// config/toon.php
return [
'compatibility_mode' => 'legacy',
'strict_mode' => false,
'delimiter' => 'comma',
'coerce_scalar_types' => true,
];
Recommended environment strategy:
production: legacy mode firststaging: trial modern mode with contract testslocal/dev: free to experiment with mode/delimiterlegacy.modern mode in staging.Create a payload fixture and verify both directions:
use PHPUnit\Framework\TestCase;
use Sbsaga\Toon\Facades\Toon;
final class ToonContractTest extends TestCase
{
public function testCriticalPayloadRoundTrip(): void
{
$payload = [
'order' => ['id' => 101, 'status' => 'paid'],
'items' => [
['sku' => 'A1', 'qty' => 2],
['sku' => 'B9', 'qty' => 1],
],
];
$toon = Toon::encode($payload);
$decoded = Toon::decode($toon);
$this->assertSame('paid', $decoded['order']['status']);
$this->assertSame('A1', $decoded['items'][0]['sku']);
}
}
Define one reusable replacer for security-sensitive logs/prompts.
use Sbsaga\Toon\Facades\Toon;
function safeToon(array $payload): string
{
return Toon::encodeWith($payload, function (array $path, string|int|null $key, mixed $value) {
if (in_array($key, ['password', 'token', 'secret', 'api_key'], true)) {
return Toon::skip();
}
if ($key === 'email') {
return '[redacted]';
}
return $value;
});
}
Measure, do not assume:
Toon::diff()Simple metric logging example:
$report = \Sbsaga\Toon\Facades\Toon::diff($payload);
logger()->info('toon.diff', $report);
Examples for automation:
# Convert fixture JSON into TOON
php artisan toon:convert tests/fixtures/invoice.json --encode --output=tests/fixtures/invoice.toon
# Validate decode with strict checks
php artisan toon:convert tests/fixtures/invoice.toon --decode --strict --pretty
# Emit conversion stats for CI logs
php artisan toon:convert tests/fixtures/invoice.json --encode --stats
If downstream parsers fail after upgrade:
compatibility_mode=legacyBecause TOON default mode remains legacy, rollback usually requires configuration change first, not code removal.
How can I help you explore Laravel packages today?