Case Conversion Middleware
The Hoffnungsträger Sprachbrücke API uses automatic case conversion middleware to provide a seamless experience between JavaScript frontend (camelCase) and Laravel backend (snake_case).
Overview
- Frontend (JavaScript): Uses
camelCase(e.g.,firstName,lastName,emailVerifiedAt) - Backend (Laravel): Uses
snake_case(e.g.,first_name,last_name,email_verified_at) - Middleware: Automatically converts between formats
Middleware Components
1. ConvertRequestToSnakeCase
File: app/Http/Middleware/ConvertRequestToSnakeCase.php
Converts incoming JSON request data from camelCase to snake_case before Laravel processing.
// Input from frontend
{
"firstName": "Maria",
"lastName": "Schmidt",
"emailVerifiedAt": null
}
// Converted for Laravel
{
"first_name": "Maria",
"last_name": "Schmidt",
"email_verified_at": null
}
Features:
- Only processes API routes (
/api/*) - Only converts JSON content
- Recursive conversion for nested objects
- Preserves array structures
- Skips Laravel reserved keys (
_token,_method)
2. ConvertResponseToCamelCase
File: app/Http/Middleware/ConvertResponseToCamelCase.php
Converts outgoing JSON responses from snake_case to camelCase for frontend consumption.
// Laravel response
{
"user": {
"first_name": "Maria",
"last_name": "Schmidt",
"email_verified_at": "2024-01-15T10:30:00Z"
}
}
// Converted for frontend
{
"user": {
"firstName": "Maria",
"lastName": "Schmidt",
"emailVerifiedAt": "2024-01-15T10:30:00Z"
}
}
Features:
- Only processes JsonResponse objects
- Only affects API routes
- Recursive conversion for nested objects
- Preserves array and primitive types
- Maintains JSON structure integrity
Registration
File: bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
// Add case conversion middleware to API routes
$middleware->api([
\App\Http\Middleware\ConvertRequestToSnakeCase::class,
\App\Http\Middleware\ConvertResponseToCamelCase::class,
]);
})
Usage Examples
Authentication Registration
Frontend Request (camelCase):
const data = {
firstName: "Maria",
lastName: "Schmidt",
email: "maria@example.com",
password: "password123",
passwordConfirmation: "password123",
role: "requester",
organizationName: "Hospital Berlin",
organizationType: "healthcare"
}
Laravel Receives (snake_case):
[
'first_name' => 'Maria',
'last_name' => 'Schmidt',
'email' => 'maria@example.com',
'password' => 'password123',
'password_confirmation' => 'password123',
'role' => 'requester',
'organization_name' => 'Hospital Berlin',
'organization_type' => 'healthcare'
]
Laravel Response (snake_case):
[
'user' => [
'id' => '01970605-9322-700e-85db-cb7c1bff6d75',
'first_name' => 'Maria',
'last_name' => 'Schmidt',
'email_verified_at' => null,
'created_at' => '2024-01-15T10:30:00Z'
]
]
Frontend Receives (camelCase):
{
user: {
id: "01970605-9322-700e-85db-cb7c1bff6d75",
firstName: "Maria",
lastName: "Schmidt",
emailVerifiedAt: null,
createdAt: "2024-01-15T10:30:00Z"
}
}
Benefits
- Developer Experience: JavaScript developers use familiar camelCase
- Laravel Consistency: Backend maintains Laravel snake_case conventions
- Automatic: No manual conversion needed
- Type Safety: Preserves data types during conversion
- API Consistency: All API responses use consistent camelCase
Testing
The middleware automatically handles conversion for:
- ✅ User registration/login
- ✅ Profile updates
- ✅ Order requests
- ✅ All API endpoints
- ✅ Nested objects and arrays
- ✅ Complex data structures
Error Handling
- Invalid JSON is passed through unchanged
- Non-API routes are not affected
- Conversion errors are logged but don't break requests
- Original request structure is preserved on errors