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

Unaltered Psr Http Message Bridge Bundle Laravel Package

loophp/unaltered-psr-http-message-bridge-bundle

Symfony bundle bridging PSR-7 HTTP messages without altering them. Converts between PSR-7 requests/responses and Symfony HttpFoundation safely, preserving headers, body streams, and URIs—useful when integrating PSR-7 middleware or clients in Symfony apps.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation Add the package via Composer:

    composer require loophp/unaltered-psr-http-message-bridge-bundle
    

    Register the bundle in config/bundles.php:

    return [
        // ...
        Loop\UnalteredPsrHttpMessageBridgeBundle\LoopUnalteredPsrHttpMessageBridgeBundle::class => ['all' => true],
    ];
    
  2. First Use Case Convert a Symfony Request to a PSR-7 ServerRequest without modifying query parameters:

    use Loop\UnalteredPsrHttpMessageBridgeBundle\Bridge\SymfonyRequestToPsr7RequestBridge;
    
    $bridge = new SymfonyRequestToPsr7RequestBridge();
    $psr7Request = $bridge->toPsr7($symfonyRequest);
    
  3. Where to Look First

    • Bridge Classes: Focus on SymfonyRequestToPsr7RequestBridge and Psr7RequestToSymfonyRequestBridge in src/Bridge/.
    • Configuration: Check config/packages/loop_unaltered_psr_http_message_bridge.yaml for defaults.
    • Tests: Review tests/ for edge cases and expected behavior.

Implementation Patterns

Common Workflows

  1. Request Conversion Convert Symfony Request to PSR-7 ServerRequest in middleware or controllers:

    public function handle(Request $symfonyRequest, Closure $next)
    {
        $bridge = app(SymfonyRequestToPsr7RequestBridge::class);
        $psr7Request = $bridge->toPsr7($symfonyRequest);
    
        // Use PSR-7 logic (e.g., with Slim, Zend, or custom PSR-7 handlers)
        $response = $this->handlePsr7($psr7Request);
        return $bridge->toSymfony($response);
    }
    
  2. Response Conversion Convert PSR-7 Response back to Symfony Response:

    $psr7Response = $this->psr7Handler->handle($psr7Request);
    $symfonyResponse = $bridge->toSymfony($psr7Response);
    return $symfonyResponse;
    
  3. Dependency Injection Bind the bridge in services.yaml for reusable access:

    services:
        Loop\UnalteredPsrHttpMessageBridgeBundle\Bridge\SymfonyRequestToPsr7RequestBridge:
            public: true
    
  4. Integration with PSR-7 Libraries Use with libraries like Slim, Zend, or Laminas:

    $app = new \Slim\App();
    $app->add(new \Slim\Middleware\ContentLengthMiddleware());
    $app->add(new \Slim\Middleware\BodyParsingMiddleware());
    
    // Convert Symfony Request to PSR-7
    $psr7Request = $bridge->toPsr7($symfonyRequest);
    $response = $app->handle($psr7Request);
    
    // Convert back to Symfony Response
    return $bridge->toSymfony($response);
    
  5. Custom Middleware Create middleware that bridges requests/responses transparently:

    class Psr7BridgeMiddleware
    {
        public function __construct(private SymfonyRequestToPsr7RequestBridge $bridge) {}
    
        public function __invoke(Request $request, Closure $next)
        {
            $psr7Request = $this->bridge->toPsr7($request);
            $psr7Response = $next($psr7Request);
            return $this->bridge->toSymfony($psr7Response);
        }
    }
    

Gotchas and Tips

Pitfalls

  1. Query Parameter Preservation

    • The package explicitly avoids altering query parameters (unlike Symfony’s default bridge). If you expect query strings to be modified (e.g., for routing), this package may not suit your needs.
    • Example: ?foo=bar&baz=qux remains unchanged during conversion.
  2. Server Parameters

    • Some SERVER parameters (e.g., PHP_SELF, REQUEST_URI) may differ between Symfony and PSR-7. Test thoroughly with your server setup (Apache/Nginx/PHP-FPM).
  3. Uploaded Files

    • File uploads (_FILES) are converted to PSR-7 UploadedFileInterface. Ensure your PSR-7 handlers support this (e.g., Slim 3+ does).
  4. Cookie Handling

    • Cookies are preserved, but ensure your PSR-7 library handles Set-Cookie headers correctly (e.g., Symfony’s Response vs. PSR-7 Response).
  5. Deprecated Features

    • Avoid using deprecated Symfony Request methods (e.g., getScriptName()) if they’re not mirrored in PSR-7.

Debugging

  1. Verify Conversions Dump the converted request/response to check for discrepancies:

    dd($bridge->toPsr7($symfonyRequest)->getQueryParams());
    
  2. Server Parameter Mismatches Compare SERVER arrays before/after conversion:

    dd([
        'Symfony' => $symfonyRequest->server->all(),
        'PSR-7'   => $psr7Request->getServerParams(),
    ]);
    
  3. Uploaded Files Validate file handling:

    $files = $psr7Request->getUploadedFiles();
    foreach ($files as $file) {
        dd($file->getClientFilename(), $file->getSize());
    }
    

Tips

  1. Performance

    • The bridge is lightweight, but avoid unnecessary conversions in hot paths. Cache the bridge instance if reused frequently.
  2. Testing

    • Use HttpFoundationTestCase or Psr7TestCase to assert conversions:
      $this->assertEquals('qux', $psr7Request->getQueryParams()['foo']);
      
  3. Extending Functionality

    • Subclass SymfonyRequestToPsr7RequestBridge to add custom logic (e.g., modify headers before conversion):
      class CustomBridge extends SymfonyRequestToPsr7RequestBridge
      {
          public function toPsr7(Request $request)
          {
              $request->headers->set('X-Custom', 'Value');
              return parent::toPsr7($request);
          }
      }
      
  4. Configuration

    • Override defaults in config/packages/loop_unaltered_psr_http_message_bridge.yaml:
      loop_unaltered_psr_http_message_bridge:
          preserve_query_string: true  # Already default; explicit for clarity
      
  5. Fallback for Missing Features

    • If a feature is missing (e.g., custom Symfony request attributes), extend the bridge or use a wrapper:
      $psr7Request = $bridge->toPsr7($symfonyRequest);
      $psr7Request = new class($psr7Request) extends \Zend\Diactoros\ServerRequest {
          public function getAttribute($name, $default = null)
          {
              return $this->request->attributes->get($name, $default);
          }
      };
      
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.
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata
splash/openapi
splash/scopes
splash/toolkit
testo/output-teamcity
testo/bridge-symfony
spatie/flare-daemon-runtime
canaltp/sam-ecore-application-manager-bundle
canaltp/sam-ecore-security-manager-bundle