Zum Hauptinhalt springen

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

  1. Developer Experience: JavaScript developers use familiar camelCase
  2. Laravel Consistency: Backend maintains Laravel snake_case conventions
  3. Automatic: No manual conversion needed
  4. Type Safety: Preserves data types during conversion
  5. 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