Installation:
composer require knackline/laravel-toon
No additional configuration is required—the package auto-registers its service provider and facade.
First Use Case: Convert a simple JSON array to Toon format:
use Knackline\LaravelToon\Facades\Toon;
$json = ['name' => 'John', 'age' => 30];
$toon = Toon::fromJson($json);
echo $toon; // Outputs compact Toon string
Where to Look First:
Knackline\LaravelToon\Facades\Toon (preferred for readability).fromJson(), toJson(), and parse() for direct conversions.JSON-to-Toon Conversion:
Toon::fromJson($array) for arrays or Toon::fromJsonFile($path) for files.$users = User::with('posts')->get();
$toon = Toon::fromJson($users->toArray());
Toon-to-JSON Parsing:
Toon::parse($toonString) to reconstruct JSON.$toonData = "users[2]{id,name}: 1,John, 2,Jane";
$json = Toon::parse($toonData);
Integration with Laravel Features:
\Log::info('User data', ['data' => Toon::fromJson($user->toArray())]);
return response()->json(Toon::fromJson($data)->toJson());
config/toon.php).
$config = Toon::parse(file_get_contents(config_path('toon.php')));
Batch Processing:
foreach ($chunk as $item) {
$toonChunk[] = Toon::fromJson($item);
}
Custom Field Mapping:
Use Toon::fromJson($array, ['custom_field' => 'toon_key']) to alias fields.
$toon = Toon::fromJson($data, ['user_id' => 'uid']);
Conditional Conversion: Dynamically convert based on request headers or user roles.
if ($request->wantsToon()) {
return Toon::fromJson($data);
}
return $data;
Validation: Validate Toon strings before parsing (e.g., check for syntax errors).
try {
$json = Toon::parse($toonString);
} catch (\InvalidArgumentException $e) {
abort(400, 'Invalid Toon format');
}
Nested Arrays/Objects:
users[3]{id,name}) to preserve hierarchy.// Fails: Loses nested structure
$toon = Toon::fromJson(['user' => ['posts' => [...]]]);
// Works: Explicitly define structure
$toon = Toon::fromJson(['users[1]{id,posts[2]{title}}' => [...]]);
Special Characters:
:) and newlines in values. Use backslashes (\) for literal colons.
// Input: "price: $10"
// Output: "price: \$10" (escaped)
addcslashes() pre-conversion.Boolean/Null Handling:
null values and converts booleans to true/false strings.Toon::fromJson($array, ['preserve_nulls' => true]) to retain null values.Performance:
file_get_contents() in chunks or use Toon::parse(file($path)).Facade vs. Class:
Toon::...) is stateless but slower for repeated calls. Use the class directly (new \Knackline\LaravelToon\Toon) in loops.
$converter = new \Knackline\LaravelToon\Toon();
foreach ($data as $item) {
$converter->fromJson($item); // Reuses instance
}
Toon::parse($toonString, true) to throw exceptions on invalid syntax.\Log::debug('Toon output:', ['toon' => $toonString]);
trim($toonString) or preg_replace('/\s+/', ' ', $toonString) to clean input.Custom Parsers:
Extend the Knackline\LaravelToon\Parsers\ParserInterface to handle domain-specific Toon dialects.
class CustomParser implements ParserInterface {
public function parse(string $toon): array { ... }
}
Register via the service provider:
$this->app->bind(
ParserInterface::class,
CustomParser::class
);
Toon Directives:
Add custom directives (e.g., @include) using the Toon::directive() method.
Toon::directive('include', function ($path) {
return file_get_contents($path);
});
Usage:
@include('config/toon.php')
Event Hooks:
Listen for toon.converted events to post-process output:
Toon::fromJson($data)->then(function ($toon) {
// Modify $toon before use
});
preserve_keys = false, indent = 2). Override via:
Toon::fromJson($data, [
'preserve_keys' => true,
'indent' => 4,
]);
php artisan vendor:publish --provider="Knackline\LaravelToon\ToonServiceProvider" to customize globally.$docs = Toon::fromJson($apiSchema);
return response($docs, 200, ['Content-Type' => 'text/toon']);
translations[3]{locale,key,value}).$this->app->instance(
Toon::class,
Mockery::mock(Toon::class)->shouldReceive('parse')->andReturn(['test' => 'data'])
);
How can I help you explore Laravel packages today?