php-standard-library/json
php-standard-library/json provides JSON encode/decode helpers with sensible defaults and typed exceptions. Safer, clearer error handling than native json_encode/json_decode, ideal for consistent JSON handling in PHP apps and libraries.
Pros:
Json::laravel()), reducing friction for adoption in Laravel apps. Aligns with Laravel’s service container and configuration system.JsonException with detailed error messages (e.g., file/line context), improving debugging in Laravel’s exception handler (App\Exceptions\Handler).config/json.php integration allows centralized control over JSON encoding/decoding flags (e.g., JSON_THROW_ON_ERROR, JSON_PRETTY_PRINT), critical for Laravel’s monorepo or microservice architectures.Json::validate() method to enforce JSON schema validation (e.g., using json-schema library), addressing a prior gap in the assessment.Cons:
Json::encode()/Json::decode() are now namespaced under Json::laravel() by default, requiring updates to existing code. Mitigate by using aliases in config/app.php.Json::pretty() is deprecated in favor of Json::encode($data, JSON_PRETTY_PRINT), which may require refactoring.Json::validate()) require symfony/validator or webonyx/graphql-php, adding complexity to composer dependencies.Core Laravel Components:
Json::laravel()->encode() in Illuminate\Http\Response factories for consistent formatting. Example:
return response()->json(Json::laravel()->encode($data), 200, ['X-Content-Type' => 'application/json']);
Json::laravel()->decode($request->getContent(), Json::THROW_ON_ERROR) in middleware or DTOs to enforce strict JSON validation.Json::validate() with Laravel’s FormRequest or Validator for schema enforcement:
use JsonSchema\Validator as JsonValidator;
$validator = Json::validate($request->json(), (new JsonValidator)->validate($schema));
Illuminate\Broadcasting or Illuminate\Cache using the package’s config-driven approach.Third-Party Libraries:
Json::laravel()->encode() for request bodies and decode responses uniformly:
$client->post('/api', [
'json' => Json::laravel()->encode($payload),
]);
Json::laravel() for consistency with other JSON operations.Database/ORM:
jsonb: Use Json::laravel()->encode() in Eloquent mutators to ensure consistent serialization:
protected $casts = [
'metadata' => 'json',
];
// Mutator:
public function setMetadataAttribute($value) {
$this->attributes['metadata'] = Json::laravel()->encode($value);
}
Json::encode() calls to Json::laravel()->encode() or add aliases in config/app.php:
'aliases' => [
'Json' => App\Providers\JsonServiceProvider::class . '::jsonAlias',
],
Json::pretty() with explicit flags or update CI/CD to flag deprecation warnings.Handler to catch JsonException and log structured errors:
public function register()
{
$this->reportable(function (JsonException $e) {
Log::error('JSON Error', ['exception' => $e, 'data' => $e->getData()]);
});
}
Json::validate() in critical paths (e.g., API gateways). Disable for non-critical endpoints if needed.public function test_json_schema_validation()
{
$validator = Json::validate(['key' => 'value'], $schema);
$this->assertTrue($validator->isValid());
}
Json::laravel() in controllers) using RefreshDatabase or Livewire tests.Json::laravel() namespace and plan a migration strategy.json_encode()/json_decode() with custom flags (e.g., JSON_UNESCAPED_SLASHES)?
Json::validate() with Laravel’s FormRequest or middleware.symfony/validator or webonyx/graphql-php to the project?
config/app.php:
'providers' => [
PhpStandardLibrary\Json\JsonServiceProvider::class,
],
config/json.php:
php artisan vendor:publish --provider="PhpStandardLibrary\Json\JsonServiceProvider" --tag="config"
response()->json() with Json::laravel()->encode() in controllers:
return response()->json(Json::laravel()->encode($data));
Json::validate() in App\Http\Requests\*:
public function rules()
{
return [
'payload' => 'required|json',
];
}
public function withValidator($validator)
{
$validator->after(function ($validator) {
$schema = file_get_contents('schemas/api.json');
Json::validate($this->payload, $schema);
});
}
Json::encode()) in shared libraries or tests, but avoid Laravel-specific features.Phase 1: Setup and Configuration
composer.json and update dependencies:
composer require php-standard-library/json ^6.1.1
config/json.php:
return [
'default_flags' => JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR,
'validate' => [
'enabled' => env('JSON_VALIDATION_ENABLED', false),
'schema_path' => 'schemas/',
],
];
config/app.php.Phase 2: Facade Migration
Json::encode()/Json::decode() calls with Json::laravel()->encode()/Json::laravel()->decode().config/app.php to maintain backward compatibility:
'aliases' => [
'Json' => App\Providers\JsonServiceProvider::class . '::jsonAlias',
],
Json::pretty().Phase 3: Validation Integration
config/json.php:
'validate' => [
'enabled' => true,
],
Json::validate() in FormRequest or middleware.Phase 4: Testing and Optimization
How can I help you explore Laravel packages today?