Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Symfony Http Bridge Laravel Package

boson-php/symfony-http-bridge

Bridge package connecting Boson PHP with Symfony HttpFoundation, providing adapters to translate requests and responses between the two ecosystems for smoother interoperability when mixing Boson components with Symfony-based HTTP handling.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require boson-php/symfony-http-bridge
    
    • No additional configuration is required for basic usage.
  2. First Use Case: Converting Symfony Request/Response to Laravel

    use Boson\SymfonyHttpBridge\SymfonyHttpBridge;
    
    // Convert Laravel Request to Symfony Request
    $symfonyRequest = SymfonyHttpBridge::toSymfonyRequest(request());
    
    // Convert Symfony Response to Laravel Response
    $laravelResponse = SymfonyHttpBridge::toLaravelResponse($symfonyResponse);
    
  3. Where to Look First

    • Bridge Class: SymfonyHttpBridge is the core class for conversions.
    • Documentation: Check the Symfony HttpFoundation docs for compatibility details.
    • Tests: If available, review the package’s tests for edge cases (though minimal due to low stars).

Implementation Patterns

Common Workflows

1. API Gateway or Middleware Integration

  • Use the bridge to normalize requests/responses between Symfony-based APIs and Laravel.
// Example: Middleware to convert Symfony Request to Laravel
public function handle($request, Closure $next) {
    $symfonyRequest = SymfonyHttpBridge::toSymfonyRequest($request);
    // Process with Symfony logic...
    $response = $next($symfonyRequest);
    return SymfonyHttpBridge::toLaravelResponse($response);
}

2. Testing Symfony Components in Laravel

  • Mock Symfony Request/Response objects for testing Symfony-dependent logic.
use Symfony\Component\HttpFoundation\Request;
use Boson\SymfonyHttpBridge\SymfonyHttpBridge;

$symfonyRequest = Request::create('/test', 'GET');
$laravelRequest = SymfonyHttpBridge::toLaravelRequest($symfonyRequest);

3. Hybrid Applications

  • Integrate Symfony bundles (e.g., security, validation) into Laravel by converting objects at boundaries.
// Example: Validate using Symfony Validator
$validator = new SymfonyValidator();
$errors = $validator->validate($data, $constraints);
return SymfonyHttpBridge::toLaravelResponse(
    new SymfonyResponse($errors)
);

4. Legacy Code Migration

  • Gradually replace Symfony components in a Laravel app by wrapping them with the bridge.
// Old Symfony Controller
public function oldSymfonyAction(Request $request) { ... }

// New Laravel Controller
public function laravelAction() {
    $symfonyRequest = SymfonyHttpBridge::toSymfonyRequest(request());
    $response = $this->oldSymfonyAction($symfonyRequest);
    return SymfonyHttpBridge::toLaravelResponse($response);
}

Integration Tips

  1. Leverage Symfony’s Features

    • Use Symfony’s Request/Response for advanced features like:
      • File upload handling ($request->files).
      • Cookie/session management ($request->cookies, $request->getSession()).
      • Content negotiation ($request->getPreferredFormat()).
  2. Performance Considerations

    • Avoid unnecessary conversions in hot paths (e.g., loops). Cache converted objects if reused.
    $symfonyRequest = SymfonyHttpBridge::toSymfonyRequest(request());
    // Reuse $symfonyRequest across multiple Symfony calls
    
  3. Type Safety

    • Use PHP 8’s array_unshift() or array_merge() carefully when converting arrays (e.g., $_SERVER or $_GET). The bridge may not handle all edge cases.
  4. Error Handling

    • Wrap conversions in try-catch blocks for robustness:
    try {
        $symfonyResponse = SymfonyHttpBridge::toSymfonyResponse($laravelResponse);
    } catch (\InvalidArgumentException $e) {
        abort(500, 'Conversion failed: ' . $e->getMessage());
    }
    

Gotchas and Tips

Pitfalls

  1. Incomplete Feature Support

    • The bridge may not support all Symfony Request/Response features (e.g., custom headers, non-standard attributes). Test thoroughly.
    • Workaround: Extend the bridge or use Symfony’s Request/Response directly where needed.
  2. Bidirectional Conversion Issues

    • Not all Laravel features map cleanly to Symfony (e.g., Laravel’s Route model binding, middleware parameters).
    • Tip: Document limitations in your codebase.
  3. Session Handling

    • Symfony’s session handling (getSession()) may not persist across conversions. Manually sync sessions if needed:
    $symfonyRequest->getSession()->set('key', $value);
    $laravelRequest->session()->put('key', $value);
    
  4. File Uploads

    • File uploads ($_FILES) may not convert seamlessly. Use Symfony’s UploadedFile for complex cases:
    $symfonyFile = $symfonyRequest->files->get('file');
    $laravelFile = SymfonyHttpBridge::toLaravelUploadedFile($symfonyFile);
    
  5. Deprecation Warnings

    • The package is a subtree split of boson-php/boson, which may have unmaintained dependencies. Check for compatibility with your Symfony version.

Debugging Tips

  1. Log Conversions

    • Log input/output of conversions to identify mismatches:
    \Log::debug('Laravel Request:', request()->toArray());
    \Log::debug('Symfony Request:', SymfonyHttpBridge::toSymfonyRequest(request())->toArray());
    
  2. Compare Objects

    • Use dump() or dd() to compare Laravel and Symfony objects:
    dd(
        request()->headers->all(),
        SymfonyHttpBridge::toSymfonyRequest(request())->headers->all()
    );
    
  3. Check for Missing Data

    • Ensure all required data (e.g., $_SERVER, $_COOKIE) is present before conversion. Laravel’s Request may filter or normalize data differently.

Extension Points

  1. Custom Conversions

    • Extend the bridge for unsupported features:
    class CustomSymfonyHttpBridge extends SymfonyHttpBridge {
        public static function toSymfonyRequest(Request $laravelRequest): Request {
            $symfonyRequest = parent::toSymfonyRequest($laravelRequest);
            // Add custom logic (e.g., set a header)
            $symfonyRequest->headers->set('X-Custom-Header', 'value');
            return $symfonyRequest;
        }
    }
    
  2. Middleware for Automatic Conversion

    • Create a middleware to auto-convert requests/responses:
    public function handle($request, Closure $next) {
        $symfonyRequest = SymfonyHttpBridge::toSymfonyRequest($request);
        $response = $next($symfonyRequest);
        return SymfonyHttpBridge::toLaravelResponse($response);
    }
    
  3. Service Provider Integration

    • Bind the bridge to the container for dependency injection:
    $this->app->singleton('symfony.http.bridge', function () {
        return new SymfonyHttpBridge();
    });
    
  4. Testing Utilities

    • Create helper methods for testing:
    function makeSymfonyRequest(array $data = []): Request {
        return SymfonyHttpBridge::toSymfonyRequest(
            Request::create('/test', 'GET', $data)
        );
    }
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle